天天看點

python 決策樹和随機森林_決策樹與随機森林執行個體

想必很多人都聽說過決策樹和随機森林,這是用來預測的數學模型,用python可以快速實作。下面這些代碼請收好,了解其中的含義以後,改改參數你也可以用這個模型進行預測啦。不過部落客以為,模型最後的尋找重要因子才是最有意思的部分~

拿到資料集的第一步,清洗資料:

import pandas as pd

import numpy as np

titanic=pd.read_csv(r'/Users/titanic_train.csv')

#删除無關列

titanic.drop(['PassengerId','Ticket','Cabin','Name'],axis=1,inplace=True)

#補全年齡缺失值

fillna_titanic=[]

for i in titanic.Sex.unique():

update=titanic.loc[titanic.Sex==i].fillna(value={'Age':titanic.Age[titanic.Sex==i].mean()})

fillna_titanic.append(update)

titanic=pd.concat(fillna_titanic)

#補全登船資訊

titanic.fillna(value={'Embarked':titanic.Embarked.mode()[0]},inplace=True)

第二步,把變量轉化成啞變量的形式:

#數值pclass轉化成類型

titanic.Pclass=titanic.Pclass.astype('category')

#啞變量處理

dummy=pd.get_dummies(titanic[['Sex','Embarked','Pclass']])

#水準合并titanic和啞變量資料集

titanic=pd.concat([titanic,dummy],axis=1)

titanic.drop(['Sex','Embarked','Pclass'],axis=1,inplace=True)

資料準備好以後,就開始搭模組化型啦。以下這些代碼不用背下來,隻要用到的時候改改參數就好了。這就是python的魅力所在,可以讓一些很複雜的事情變得你也可以上手。

#訓練集和測試集的搭建

from sklearn import model_selection

#取出所有自變量名稱

predictors=titanic.columns[1:]

#将資料拆分為訓練集和測試集,測試集的比例為25%

X_train,X_test,y_train,y_test=model_selection.train_test_split(titanic[predictors],titanic.Survived,

test_size=0.25,random_state=1234)

#使用網格法找出最優越模型參數

from sklearn.model_selection import GridSearchCV

from sklearn import tree

#預設各參數的不同選項值

max_depth=[2,3,4,5,6]

min_samples_split=[2,4,6,8]

min_samples_leaf=[2,4,8,10,12]

#将各參數的值以字典的形式組織起來

parameters={'max_depth':max_depth,'min_samples_split':min_samples_split,'min_samples_leaf':min_samples_leaf}

#網格搜尋法,測試不同的參數值

grid_dtcateg=GridSearchCV(estimator=tree.DecisionTreeClassifier(),param_grid=parameters,cv=10)

#模型拟合

grid_dtcateg.fit(X_train,y_train)

#傳回最佳組合的參數值

print(grid_dtcateg.best_params_)

最佳參數組合為:3,4,2

找到最佳組合的參數後,試着搭建一棵決策樹:

#單棵決策樹模組化

from sklearn import metrics

#建構分類決策樹

CART_Class=tree.DecisionTreeClassifier(max_depth=3,min_samples_leaf=4,min_samples_split=2)

#模型拟合

decision_tree=CART_Class.fit(X_train,y_train)

#模型在測試集上的預測

pred=CART_Class.predict(X_test)

#模型的準确率

print('模型在測試集的預測準确率為:',metrics.accuracy_score(y_test,pred))

準确率為0.83,還不錯。

繪圖表現這個準确率:

import matplotlib.pyplot as plt

y_score=CART_Class.predict_proba(X_test)[:,1]

fpr,tpr,threshold=metrics.roc_curve(y_test,y_score)

#計算AUC的值

roc_auc=metrics.auc(fpr,tpr)

#繪制面積圖

plt.stackplot(fpr,tpr,color='steelblue',alpha=0.5,edgecolor='black')

#添加邊際線

plt.plot(fpr,tpr,color='black',lw=1)

#添加對角線

plt.plot([0,1],[0,1],color='red',linestyle='-')

#添加文本資訊

plt.text(0.5,0.3,'ROC curve(area=%0.2f)'%roc_auc)

#添加x軸與y軸标簽

plt.xlabel('1-Specificity')

plt.ylabel('Sensitivity')

#顯示圖形

plt.show()

python 決策樹和随機森林_決策樹與随機森林執行個體

建構随機森林的模型看看:

#建構随機森林,随機森林可以提高單棵決策樹的預測準确度

from sklearn import ensemble

RF_class=ensemble.RandomForestClassifier(n_estimators=200,random_state=1234)

#随機森林的拟合

RF_class.fit(X_train,y_train)

#模型在測試集上的預測

RFclass_pred=RF_class.predict(X_test)

#模型的準确率

print('模型在測試集的預測準确率為:',metrics.accuracy_score(y_test,RFclass_pred))

随機森林的準确率為:0.85,比單棵決策樹的準确率更高。

畫個圖看看準确率:

#計算繪圖資料

y_score=RF_class.predict_proba(X_test)[:,1]

fpr,tpr,threshold=metrics.roc_curve(y_test,y_score)

#計算AUC的值

roc_auc=metrics.auc(fpr,tpr)

#繪制面積圖

plt.stackplot(fpr,tpr,color='steelblue',alpha=0.5,edgecolor='black')

#添加邊際線

plt.plot(fpr,tpr,color='black',lw=1)

#添加對角線

plt.plot([0,1],[0,1],color='red',linestyle='-')

#添加文本資訊

plt.text(0.5,0.3,'ROC curve(area=%0.2f)'%roc_auc)

#添加x軸與y軸标簽

plt.xlabel('1-Specificity')

plt.ylabel('Sensitivity')

#顯示圖形

plt.show()

python 決策樹和随機森林_決策樹與随機森林執行個體

哪些因素決定着泰坦尼克号上的獲救率呢:

#自變量的重要性程度

importance=RF_class.feature_importances_

#建構序列用于繪圖

Impt_Series=pd.Series(importance,index=X_train.columns)

#對序列排序繪圖

Impt_Series.sort_values(ascending=True).plot(kind='barh')

plt.show()

python 決策樹和随機森林_決策樹與随機森林執行個體

結論已經顯而易見,大家有什麼啟發嗎?