day3 机器学习 sklearn学习 集成算法-随机森林

# todo:  集成算法模块  集成学习 ensemble
# 决策树非常容易 过拟合:在训练集上表现优秀,却在测试集上表现糟糕,一般用剪枝
# 目前最受欢迎的集成算法GBDT

# todo:三类集成算法:
# ·装袋法(Bagging):构建多个相互独立的评估器,然后对其预测进行平均或多数表决原则来决定集成评估器的结果。装袋法的代表模型就是随机森林
# ·提升法(Boosting) :基评估器是相关的,是按顺序一一构建的。其核心思想是结合弱评估器的力量一次次对难以评估的样本进行预测,从而构成一个强评估器。提升法的代表模型有Adaboost和梯度提升树
# ·stacking

# todo:
# 类 类的功能
# ensemble.AdaBoostClassifier AdaBoost分类
# ensemble.AdaBoostRegressor Adaboost回归
# ensemble.BaggingClassifier 装袋分类器
# ensemble.BaggingRegressor 装袋回归器
# ensemble.ExtraTreesClassifier Extra-trees分类(超树,极端随机树)
# ensemble.ExtraTreesRegressor Extra-trees回归
# ensemble.GradientBoostingClassifier 梯度提升分类
# ensemble.GradientBoostingRegressor 梯度提升回归
# ensemble.IsolationForest 隔离森林
# ensemble.RandomForestClassifier 随机森林分类
# ensemble.RandomForestRegressor 随机森林回归
# ensemble.RandomTreesEmbedding 完全随机树的集成
# ensemble.VotingClassifier 用于不合适估算器的软投票/多数规则分类器

# todo:重要参数
#  新的参数  :  n_estimators    现有版本默认10,在0.22版本默认100,推荐0-200
# 参数                            含义
# criterion                     不纯度的衡量指标,有基尼系数和信息熵两种选择
# max_depth                     树的最大深度,超过最大深度的树枝都会被剪掉
# min_samples_leaf              一个节点在分枝后的每个子节点都必须包含至少min_samples_leaf个训练样本,否则分枝就不会发生
# min_samples_split             一个节点必须要包含至少min_samples_split个训练样本,这个节点才允许被分枝,否则分枝就不会发生
# max_feature max_features      限制分枝时考虑的特征个数,超过限制个数的特征都会被舍弃,默认值为总特征个数开平方取整
# min_impurity_decrease         限制信息增益的大小,信息增益小于设定数值的分枝不会发生

from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine

# 导入红酒数据
wine = load_wine()
# print(wine.data.shape)
# print(wine.target)
# 实例化
# 训练集带入实例化后的模型去进行训练,使用的接口是fit
# todo:训练模型对比决策树和随机森林

# 使用其它接口与将测试集导入我们训练好的模型,去获取我们希望获取的结果(score,y_test)
from sklearn.model_selection import train_test_split
#
# 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_C = clf.score(Xtest, Ytest)
# score_r = rfc.score(Xtest, Ytest)
# print("clf:{}".format(score_C))  # 结果 clf:0.9444444444444444
# print("rfc:{}".format(score_r))  # 结果 rfc:0.981481481481481

# 上面的单个树效果不太容易让人信服,更进一步
# todo: 交叉验证: cross_val_score
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()

# todo: 画出随机森林和决策树在十组交叉验证下的效果对比-----》用于体会下随机森林的强大
################################# 结果发现随机森林吊打决策树
# rfc_l = []
# clf_l = []
# for i in range(10):
#     rfc = RandomForestClassifier(n_estimators=25)
#     rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean() # 求平均
#     rfc_l.append(rfc_s)
#     clf = DecisionTreeClassifier()
#     clf_s = cross_val_score(clf,wine.data,wine.target,cv=10).mean()
#     clf_l.append(clf_s)
# plt.plot(range(1,11),rfc_l,label = "Random Forest")
# plt.plot(range(1,11),clf_l,label = "Decision Tree")
# plt.legend()
# plt.show()
################################# 结果发现随机森林吊打决策树


# todo:   n_estimators的学习曲线 可以找出当n_estimators等于多少的时候,返回预测结果最好
###############训练时间稍长
# superpa = []
# for i in range(200):
#     rfc = RandomForestClassifier(n_estimators=i+1,n_jobs=-1)
#     rfc_s = cross_val_score(rfc,wine.data,wine.target,cv=10).mean()
#     superpa.append(rfc_s)
# print(max(superpa),superpa.index(max(superpa)))
# plt.figure(figsize=[20,5])
# plt.plot(range(1,201),superpa)
# plt.show()                            ##  结果   0.9888888888888889 31(位置32的时候最好)


# todo:重要属性
# 模型.estimators_             用来查看随机森林中所有树的状况列表
# bootstrap                     默认为True,有放回的随机抽样技术,通常我们不会设置为false
# oob_score_                    默认false,袋外数据  因为随机森林用的是装袋,很可能有一些数据没有被模型选择,掉落在袋外
# 也就是说,在使用随机森林的时候,可以不划分测试集和训练集,用袋外数据来训练
# 即设置 oob_score=True
# 例如
rfc = RandomForestClassifier(n_estimators=25, oob_score=True)
rfc.fit(wine.data, wine.target)
print(rfc.oob_score_)  # 0.9719101123595506  效率还蛮高,所以建议自己判断划不划分训练集测试集


# todo:常用接口
# .apply(X_test)            返回每个测试样本所在这棵树的叶子节点的索引
# .fit(X_train,Y_train)    训练模型
# .predict(X_test)          返回每个测试样本的分类/回归结果
# score(x_test,y_test)      模型打分
# .feature_importances_     查看所有特征的重要性,数越大,特征越重要
# .predict_proba            决定测试样本的分类
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章