【课程设计】基于决策树算法的学生成绩分析( 二 )


在数据可视化方面有很多第三方库,比如、、、Bokeh、、、pygal、、等,本设计选择来实现可视化,该库可以绘制柱形图、散点图、气泡图、堆积图、树地图、雷达图、热力图、组合图等众多图表,功能非常强大 。
2、决策树原理 (1)决策树构建三步骤
i. 特征值选择
特征选择决定了使用哪些特征来做判断 。在训练数据集中,每个样本的属性可能有很多个,不同属性的作用有大有小 。因此,特征选择的作用就是筛选与分类结果相关性较高的特征,也就是分类能力较强的特征 。依据不同的特征选择,有如下三种经典的决策树算法:
算法名称
特征选择依据
ID3
信息增益
C4.5
信息增益率
CART
基尼系数
ii. 决策树生成
特征选择好后,从根节点出发,对节点计算所得的特征选择依据值(信息增益、信息增益率、基尼系数),选择值最大的特征作为节点特征,根据该特征的不同取值建立子节点;对每个子节点使用相同的方法生成新的子节点,直到特征选择依据值很小或者没有特征可以选择为止 。
iii. 决策剪枝
剪枝的目的是为了对抗过拟合,通过主动去掉分支来降低拟合过度发风险 。
(2)算法对比与选择
3种经典决策树算法对比
算法
特征选择
树类型
特征类型
缺失
剪枝
任务
ID3
信息增益
多叉
离散
No
无剪枝
分类
C4.5
信息增益率
多叉
离散/连续
Yes
有剪枝
分类
CART
基尼系数
二叉
离散/连续
Yes
有剪枝
分类/回归
本设计所用数据源的特征是:树类型为多叉树,特征值是离散值,目标是分来 。所以,选择C4.5算法实现 。

【课程设计】基于决策树算法的学生成绩分析

文章插图
(3)决策树流程图
四、实验环境
2020.1.2 x64
3.8.1
五、实验方法及步骤 0、主函数
if __name__ == '__main__':# 加载数据data = http://www.kingceram.com/post/pd.read_csv('student_data.csv')# 数据预处理feature,label = data_preprocessing(data)# 构造模型mytree = structural_model(feature,label)# 可视化训练好的决策树tree_visualise(mytree)# 计算预测正确率feature_train, feature_test, label_train, label_test = train_test_split(feature, label, test_size=0.3)rate = np.sum(mytree.predict(feature_test) == label_test) / mytree.predict(feature_test).sizeprint('训练集数量:',label_train.size)print('测试集数量:',label_test.size)print('正确率:',rate)
1、数据预处理
def data_preprocessing(data):# 数据清洗,采用用平均值填充空缺值for column in list(data.columns[data.isnull().sum() > 0]):mean_val = data[column].mean()data[column].fillna(mean_val, inplace=True)data = http://www.kingceram.com/post/np.array(data.values)feature = data[:,0:3]label = data[:,3]for i in range(np.size(label)):if label[i]<60:label[i] = 3elif label[i]<80 and label[i]>59:label[i] = 2else:label[i] = 1return feature,label
2、构建模型 (1)数据集划分
# 数据集划分,70%训练数据,30%测试数据feature_train, feature_test, label_train, label_test = train_test_split(feature, label, test_size=0.3)
(2)调参
i 调
# 选取最合适的深度max_depths = []for max_depth in range(10):clf = tree.DecisionTreeClassifier(max_depth=max_depth+1)clf.fit(feature_train, label_train) # 拟合score = clf.score(feature_test,label_test)max_depths.append(score)best_depth = max_depths.index(max(max_depths))+1plt.figure(figsize=(20, 8), dpi=80)plt.plot(range(1, 11), max_depths)plt.xlabel('max depth')plt.ylabel('evaluate score')plt.show();