决策树和随机森林算法代码

# 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()

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值