import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn import tree
import graphviz
import pydotplus
import matplotlib.pyplot as plt
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 = np.array(data.values)
feature = data[:,0:3]
label = data[:,3]
for i in range(np.size(label)):
if label[i]<60:
label[i] = 3
elif label[i]<80 and label[i]>59:
label[i] = 2
else:
label[i] = 1
return feature,label
def structural_model(feature,label):
# 数据集划分,70%训练数据,30%测试数据
feature_train, feature_test, label_train, label_test = train_test_split(feature, label, test_size=0.3)
# 选取最合适的深度
max_depths = []
for max_depth in range(10):
clf = tree.DecisionTreeClassifier(criterion='entropy',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))+1
# plt.figure(figsize=(20, 8), dpi=80)
# plt.plot(range(1, 11), max_depths)
# plt.xlabel('max depth')
# plt.ylabel('evaluate score')
# plt.show();
# 选取最合适的最小叶子树
min_samples = []
for min_sample in range(30):
clf = tree.DecisionTreeClassifier(criterion='entropy',max_depth=best_depth,min_samples_leaf=min_sample+5)
clf.fit(feature_train, label_train) # 拟合
score = clf.score(feature_test, label_test)
min_samples.append(score)
best_min_samples_leaf = min_samples.index(max(min_samples))+5
# plt.figure(figsize=(20, 8), dpi=80)
# plt.plot(range(4, 34), min_samples)
# plt.xlabel('min samples leaf')
# plt.ylabel('evaluate score')
# plt.show();
# 根据最合适的参数构建模型
mytree = tree.DecisionTreeClassifier(criterion='entropy',max_depth=best_depth,min_samples_leaf=best_min_samples_leaf)
mytree.fit(feature_train,label_train)
return mytree
def tree_visualise(mytree):
# 可视化
dot_data = tree.export_graphviz(mytree, out_file=None,\
feature_names=["Attendance","Preview","Job"],\
class_names=["excellent","good","poor"],\
rounded=True)
graph = pydotplus.graph_from_dot_data(dot_data)
graph.write_pdf("dtree10.pdf")
if __name__ == '__main__':
# 加载数据
data = 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).size
print('训练集数量:',label_train.size)
print('测试集数量:',label_test.size)
print('正确率:',rate)
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
资源包含文件:设计报告word+源码及数据+项目截图 PyCharm Community Edition 2020.1.2 x64 Python 3.8.1 本文所训练的数据量只有1852条,其中用于训练模型的只有1296条,数据量相对较小,正确率只达到了62.3%。随着教学的继续,网络平台上会积累更多的学生学习数据,随着数据量的增长,模型也会训练的越来越好,预测精确率越来越高。 详细介绍参考:https://biyezuopin.blog.csdn.net/article/details/122637039?spm=1001.2014.3001.5502
资源推荐
资源详情
资源评论
收起资源包目录
基于Python决策树算法的学生学习行为数据分析.zip (11个子文件)
基于Python决策树算法的学生学习行为数据分析 代码及数据
student_data.csv 36KB
code.py 3KB
截图
$FYD)3EK5@023AM$F{D}@8K.png 30KB
图片2.png 51KB
图片3.png 174KB
图片1.png 65KB
图片4.png 15KB
SCRMSZO]9)]7I67$M~E`6ZY.png 101KB
A7TKXA_8~DEIW4P(4C28$XO.png 33KB
$T~4IFZ2]~11FKEX%}R(T$K.png 148KB
基于Python决策树算法的学生学习行为数据分析 设计报告.doc 530KB
共 11 条
- 1
shejizuopin
- 粉丝: 9539
- 资源: 1288
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
前往页