实验的数据
提取码 73rt
画出决策树的代码
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score
from graphviz import Source
from IPython.display import Image
from sklearn import tree
from sklearn import metrics
af = pd.read_csv('data3/1test.csv', encoding='gbk')
df = pd.read_csv('data3/2train.csv', encoding='gbk')
cf = pd.read_csv('data3/3validation.csv', encoding='gbk')
# 2.提取特征变量与目标变量
X = df.drop(columns=['类别'])
y = df['类别']
C = cf.drop(columns=['类别'])
c = cf['类别']
A = af.drop(columns=['类别'])
a = af['类别']
# 计算混淆矩阵
clf = tree.DecisionTreeClassifier(max_depth=3) # 可以加参数max_depth=3,criterion='entropy'
clf = clf.fit(X, y)
clf.score(X, y)
predicted_y = clf.predict(X)
print(metrics.classification_report(y, predicted_y))
print('Confusion matrix:' )
print( metrics.confusion_matrix(y, predicted_y) )
# 生成并显示决策树图
featureName = ['shuXin1', 'shuXin2', 'shuXin3', 'shuXin4', 'shuXin5', 'shuXin6',
'shuXin7', 'shuXin8', 'shuXin9', 'shuXin10', 'shuXin11', 'shuXin12', 'shuXin13', 'shuXin14', 'shuXin15']
className = ['0', '1']
# 生成图
graph = Source(tree.export_graphviz(clf, out_file=None, feature_names=featureName, class_names=className, filled=True,
rounded=True, special_characters=True))
# 保存到文件中并显示
png_bytes = graph.pipe(format='png')
with open('dectree.png', 'wb') as f:
f.write(png_bytes)
Image(png_bytes)
# 简单预测
# a=[[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14],[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]]
# print(clf.predict(a))
用决策树的一系列研究
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score
# 想输出什么就把注释的代码删掉就好了,全部输出太乱了。
# 1.数据读取与预处理
af = pd.read_csv('data3/1test.csv', encoding='gbk')
df = pd.read_csv('data3/2train.csv', encoding='gbk')
cf = pd.read_csv('data3/3validation.csv', encoding='gbk')
# df = pd.read_csv('data3/4combine.csv', encoding='gbk') # 用混合的训练
# af.info()
# 2.提取特征变量与目标变量
X = df.drop(columns=['类别'])
y = df['类别']
C = cf.drop(columns=['类别'])
c = cf['类别']
A = af.drop(columns=['类别'])
a = af['类别']
# cb = cbf.drop(columns=['Lei'])
# cb = cbf['Lei']
# 3.划分训练集与测试集 训练集是2train/4combine 可以自己调整,通过改变读取的数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=120)
# print(X_train) 一堆数据(15列)
# print(X_test) 一堆数据(15列)
# print(y_train) 0或者1 和X_train 对应
# print(y_test) 0或者1 和y_test对应
# 4.模型训练与拟合
model = DecisionTreeClassifier(max_depth=15, random_state=123)
model.fit(X_train, y_train) # 执行训练过程,用训练集train
# 5.算出预测的值
# (1)这里算的是第三个数据集的预测,然后把结果放在12test.csv的文件中
c_pred = model.predict(C)
column = ['Leibie']
test = pd.DataFrame(columns=column, data=c_pred)
test.to_csv('data3/5predict.csv')
# (2)训练集自己训练自己,看看预测结果准不准
y_pred = model.predict(X_test) # 这里放入的X_test 就是一大串想要验证的数据,这里是输入训练集进行预测,等下把预测的结果比对即可
# (3)放入第一个数据集,把预测的结果算出来
a_pred = model.predict(A) # 这里放入的是第一个数据集,等会儿用于数据比对
# 6.用预测的和实际的对比检验(采用已经有的model的准确率,和精确的准确率)
# (1)训练集自己和自己比对
# score = accuracy_score(y_pred, y_test) # print(score)这里输出的是预测和结果的准确度
# print(score)
# (2)训练集和test比对
score = accuracy_score(a_pred, a)
# print(score)
# (3)自己预测的第三组数据放进去,第三组自己比较
# score = accuracy_score(c_pred, c)
# print(score)
model.score(X_test, y_test) # print()这里输出的是用model模型自带的来看准确率,两个选一个,我选上面的
# ************************************以下的预测都是用4combine的数据********************************
# 7.系统预测类型是0还是1的概率
y_pred_proba = model.predict_proba(X_test)
b = pd.DataFrame(y_pred_proba, columns=['no', 'yes']) # 系统预测类型是0还是1的概率
print(b)
# 8.计算有关阈值,假报警率,和命中率的列表
fpr, tpr, thres = roc_curve(y_test, y_pred_proba[:, 1])
b = pd.DataFrame()
b['阈值'] = list(thres)
b['假报警率'] = list(fpr)
b['命中率'] = list(tpr)
# print(b)
# 9.把列表画出对应的ROC的图
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.plot(fpr, tpr)
plt.xlabel('假报警率')
plt.ylabel('命中率')
plt.title('ROC曲线')
plt.show()
asd = roc_auc_score(y_test, y_pred_proba[:, 1])
# print(asd) 算出ROC曲线的面积
# 10.算各个数据的特征值
features = X.columns
importances = model.feature_importances_
DF =pd.DataFrame()
DF['特征名称'] = features
DF['特征重要性'] = importances
DF.sort_values('特征重要性', ascending=False)
# print(DF)



