机器学习-集成之随机森林算法原理及实战
生活随笔
收集整理的這篇文章主要介紹了
机器学习-集成之随机森林算法原理及实战
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Bagging和隨機森林
- 前言
- 集成學習是目前機器學習的一大熱門方向。簡單來說,集成學習就是組合許多弱模型以得到一個預測結果比較好的強模型。對于常見的分類問題就是指采用多個分類器對數據集進行預測,把這些分類器的分類結果進行某種組合(如投票)決定分類結果,從而整體提高分類器的泛化能力。
- 集成學習對于大數據集和不充分數據都有很好的效果。因為一些簡單模型數據量太大而很難訓練,或者只能學習到一部分,而集成學習方法可以有策略地將數據集劃分成一些小數據集,并分別進行訓練,之后根據一些策略進行組合。相反,如果數據量很少,可以使用bootstrap進行抽樣,得到多個數據集,分別進行訓練后再組合。
- 集成學習中組合的模型可以是同一類型的模型,也可以是不同類型的模型。根據采用的數據采樣、預測方法等的不同,常見的集合組合策略主要有平均算法和Boosting兩類。其中,平均算法利用不同估計算法的結果平均進行預測,在估計模型上按照不同的變化形式可以進一步劃分為粘合(Pasting)、分袋(Bagging)、子空間(Subspacing)和分片(Patches)等。Boosting算法通過一系列聚合的估計模型加權平均進行預測。
- 其中比較典型的算法就是隨機森林方法和AdaBoost方法。
- 簡介
- 隨機森林算法是一種典型的基于決策樹的集成算法。它是通過集成學習的思想將多棵樹集成的一種算法。20世紀80年代Breiman等發明分類樹的算法,通過反復二分數據進行分類或回歸,使機器學習模型較傳統的神經網絡方法計算量大大降低。2001年Breiman把分類樹組合成隨機森林,即在變量和數據的使用上進行隨機化,生成許多分類樹,再匯總分類樹的結果。隨機森林在運算量沒有顯著提高的前提下提高了預測精度,它對多元非線性不敏感。結果對缺失數據和非平衡的數據比較穩健,可以起到很好地預測多達幾千個解釋變量的作用。
- 原理
- 傳統的Bagging抽樣方法,會從數據集中重復抽取大小為N的子樣本,這就導致有的數據會重復出現。抽取子樣本后,使用原始數據集作為測試集,而多個子樣本作為訓練集。與Bagging方法相比,隨機森林方法首先從樣本中隨機抽取n個樣本,然后結合隨機選擇的特征K,對它們進行m次決策樹構建,這里多了一次針對特征的隨機選擇過程。
- 隨機森林的每一棵分類樹為二叉樹,其生成遵循自頂向下的遞歸分裂原則,即從根節點開始依次對訓練集進行劃分。在二叉樹中,根節點包含全部訓練數據,按照節點純度最小原則,分裂為左節點和右節點,它們分別包含訓練數據的一個子集。按照同樣的規則節點繼續分裂,直到滿足分支停止規則而停止生長。若節點n上的分類數據全部來自同一類別,則此節點的純度I(n)=0,純度度量方法采用Gini準則。
- 具體實現過程如下。
- 原始訓練集為N,采用Bootstrap法有放回地隨機抽取k個新的自助樣本集,并由此構建k棵分類樹,每次未被抽到的樣本組成了k個袋外數據。
- 設有M個變量,則在每一棵樹的每個節點處隨機抽取M1個變量,然后在M1中選擇一個最具有分類能力的變量,變量分類的閾值通過檢查每一個分類點確定。
- 每一棵樹最大限度地生長,不做任何修剪。
- 將生成的多棵分類樹組成隨機森林,用隨機森林分類器對新的數據進行判別與分類,分類結果按樹分類器的投票多少而定。
- 隨機森林是一種利用多個分類樹對數據進行判別與分類的方法,其特點主要表現在數據隨機選取和特征隨機選取兩個方面。
- 數據隨機選取是指從原始數據集中選取數據組成不同的子數據集,利用這些子數據集構建子決策樹,觀察子決策樹的分類結果,隨機森林的分類結果屬于子決策樹的分類結果指向多的那個。
- 特征隨機選取是指隨機森林中子樹的每一個分裂過程并未用到所有的待選特征,而是從所有的待選特征中隨機選取一定的特征,之后再在隨機選取的特征中選取最優的特征。
- 實戰
- 使用隨機森林預測乘客存活概率
- 使用Kaggle提供的Titanic數據集
- 這道競賽題,訓練數據少,使用邏輯回歸、SVM等算法,容易出現預測糟糕的情況。可以采用分析特征重要性的同時,建立隨機森林模型來進行分類。
- 基于sklearn實現。
- 代碼
- # -*-coding:utf-8-*-import numpy as npimport pandas as pdfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.model_selection import cross_val_scoredef get_data():train = pd.read_csv('data/train.csv', dtype={'Age': np.float64})test = pd.read_csv('data/test.csv', dtype={'Age': np.float64})return train, testdef harmonize_data(titanic):"""預處理數據,隨機森林不允許非數值、空置等:param titanic::return:"""titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())titanic.loc[titanic['Sex']=='male','Sex']=0titanic.loc[titanic['Sex']=='female','Sex']=1titanic['Embarked'] = titanic['Embarked'].fillna('S')titanic.loc[titanic['Embarked']=='S','Embarked']=0titanic.loc[titanic['Embarked']=='C','Embarked']=1titanic.loc[titanic['Embarked']=='Q','Embarked']=2titanic['Fare'] = titanic['Fare'].fillna(titanic['Fare'].median())return titanicdef create_submission(alg, train, test, predictors, filename):"""文件輸出,一般競賽平臺要求提交數據集為id+label:param alg::param train::param test::param predictors::param filename::return:"""alg.fit(train[predictors], train['Survived'])predictions = alg.predict(test[predictors])submission = pd.DataFrame({'PassengerId': test['PassengerId'],'Survived': predictions})submission.to_csv(filename, index=False)if __name__ == '__main__':train, test = get_data()train_data = harmonize_data(train)test_data = harmonize_data(test)# 確定模型的特征predictors = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']# 建模alg = RandomForestClassifier(random_state=1,n_estimators=150,min_samples_split=4,min_samples_leaf=2)# 交叉驗證scores = cross_val_score(alg,train_data[predictors],train_data['Survived'],cv=3)print(scores.mean())print(scores.std())# 預測結果輸出create_submission(alg, train_data, test_data, predictors, 'data/result.csv')
- 效果
- 補充說明
- 參考書為《Python3數據分析與機器學習實戰》,對部分錯誤修改
- 具體數據集和代碼見我的Github,歡迎Star或者Fork
- Kaggle是個不錯的數據挖掘競賽平臺
總結
以上是生活随笔為你收集整理的机器学习-集成之随机森林算法原理及实战的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据挖掘竞赛-轴承故障检测训练赛
- 下一篇: 机器学习-集成之AdaBoost算法原理