# 1、导入需要的算法库和模块以及数据集
# 2、实例化数据集
# 3、查看数据集属性
# 4、划分数据
# 5、建立模型
# 6、训练模型
# 7、计算准确度
# 8、查看特征的重要性
from sklearn.datasets import load_wine # 红酒数据集
from sklearn import tree # 决策树
from sklearn.model_selection import train_test_split # 划分训练集和测试集
wine = load_wine() # 实例化数据集
print(wine.data.shape) # 特征矩阵
print(wine.target) # 标签
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3) # 将数据集的30%划分为测试集,其他的划分为训练集
clf = tree.DecisionTreeClassifier(criterion="entropy") # 实例化树模型
clf = clf.fit(Xtrain, Ytrain) # 训练树模型
score = clf.score(Xtest, Ytest) # 返回预测的准确度
print("准确度:", score)
print("特征的重要性:", clf.feature_importances_) # 查看特征的重要性
# # 确定预剪枝最优参数
# 1、导入需要的算法库和模块以及数据集
# 2、实例化数据集
# 3、划分数据
# 4、建立模型
# 5、训练模型
# 6、计算准确度
# 7、可视化超参数学习曲线
from sklearn.datasets import load_wine # 红酒数据集
from sklearn import tree # 决策树
from sklearn.model_selection import train_test_split # 划分训练集和测试集
import matplotlib.pyplot as plt
wine = load_wine() # 实例化数据集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3) # 将数据集的30%划分为测试集,其他的划分为训练集
# 确认最优的剪枝参数
test = [] # 保存不同max_depth下计算得到的精度
for i in range(10):
clf = tree.DecisionTreeClassifier(max_depth=i + 1, criterion="entropy", random_state=30,
splitter="random") # 实例化树模型1、criterion: 特征选取标准。默认:gini。可选gini(基尼系数)或者entropy(信息增益)。
# splitter:用于在每个节点上选择拆分的策略。可选“best”, “random”,默认“best”
clf = clf.fit(Xtrain, Ytrain) # 训练树模型
score = clf.score(Xtest, Ytest) # 训练集上的准确度
test.append(score)
print("最高精度为:", max(test), "所对应的树的深度:", test.index(max(test)) + 1) # 输出最高精度以及所对应的树的深度
# 可视化
plt.plot(range(1, 11), test, color="red", label="max_depth")
plt.legend() # 显示标签
# plt.savefig("2.png")
# # 交叉验证
from sklearn import tree # 决策树
from sklearn.datasets import load_wine # 红酒数据集
from sklearn.model_selection import cross_val_score # 交叉验证
import matplotlib.pyplot as plt # 可视化工具包
wine = load_wine() # 实例化数据集
clf = tree.DecisionTreeClassifier(criterion="entropy") # 实例化树模型
clf_s = cross_val_score(clf, wine.data, wine.target, cv=10) # 进行10次交叉验证得到每一次的准确度
print(clf_s) # 十次交叉验证的结果
print(clf_s.mean()) # 十次交叉验证的平均值
# 利用交叉验证确认最优的剪枝参数
test = [] # 保存不同max_depth下计算得到的精度
for i in range(10): # 构建200次不同规模的随机森林(n_estimators表示随机森林含有多少课随机树)
clf = tree.DecisionTreeClassifier(max_depth=i + 1, criterion="entropy", random_state=0,
splitter="random") # 实例化树模型
rfc_s = cross_val_score(clf, wine.data, wine.target, cv=10).mean() # 进行10次交叉验证得到准确度的平均值
test.append(rfc_s) # 将结果加入数组中
print("最高精度为:", max(test), "所对应的随机森林规模为:", test.index(max(test)) + 1) # 输出最高精度以及所对应的最佳max_depth
# 可视化
plt.plot(range(1, 11), test, color="red", label="max_depth")
plt.legend() # 显示标签
# plt.savefig("3.png")
# # 随机森林
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)
# 实例化
clf = DecisionTreeClassifier(random_state=0) # 决策树
rfc = RandomForestClassifier(random_state=0) # 随机森林
# 将训练集带入实例化后的模型训练
clf = clf.fit(Xtrain, Ytrain)
rfc = rfc.fit(Xtrain, Ytrain)
# 将预测集导入训练好的模型,获取希望获取的结果(score, y_test)
score_c = clf.score(Xtest, Ytest)
score_r = rfc.score(Xtest, Ytest)
print("Single Tree:{}".format(score_c),
"Random Forest:{}".format(score_r))
# # 显示随机森林中每棵树的信息
# # 每棵树的信息只有random_state不同
# print(rfc.estimators_)
#
# # 获取第一棵树的相关参数信息
# print(rfc.estimators_[0].random_state)
# print(rfc.estimators_[0].max_depth)
# # 获取所有树的random_state信息
# # 由于数据类型的原因只能用for循环获取
# for i in range(len(rfc.estimators_)):
# print(rfc.estimators_[i].random_state)
# 获取每个特征的重要程度
print(rfc.feature_importances_)
# # 为了验证模型的稳定性,可以使用交叉验证来完成
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc, wine.data, wine.target, cv=10) # 十折交叉验证
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf, wine.data, wine.target, cv=10)
plt.plot(range(1, 11), rfc_s, label="RandomForest")
plt.plot(range(1, 11), clf_s , label="DecisionTree")
plt.legend()
plt.show()
# # 画出随机森林与决策树在十组交叉验证下的效果对比
X = wine.data
y = wine.target
rf = []
cl = []
for i in range(10):
print(i)
rfc = RandomForestClassifier(n_estimators=25)
rfc_s = cross_val_score(rfc, X, y, cv=10).mean()
rf.append(rfc_s)
clf = DecisionTreeClassifier()
clf_s = cross_val_score(clf, X, y, cv=10).mean()
cl.append(clf_s)
plt.plot(range(1, 11), rf, label='RandomForest')
plt.plot(range(1, 11), cl, label='DecisionTree')
plt.legend()
plt.show()
# # 画出n_estimators的学习曲线,选取最佳的n_estimators取值
superpa = []
for i in range(20):
print(i)
rfc = RandomForestClassifier(n_estimators=i+1, n_jobs=-1)
rfc_s = cross_val_score(rfc, X, y, cv=10).mean()
superpa.append(rfc_s)
# list.index(object) # 对象object在list当中的索引
print(max(superpa), superpa.index(max(superpa))+1)
plt.figure(figsize=[20, 5])
plt.plot(range(1, 21), superpa)
plt.show()
决策树和随机森林算法代码
于 2023-08-09 18:33:55 首次发布