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            決定測試樣本的分類
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章