作者:Abhishek Sharma
翻譯:陳超
校對:丁楠雅
本文長度爲4600字,建議閱讀20分鐘
本文以銀行貸款數據爲案例,對是否批准顧客貸款申請的決策過程進行了算法構建,並對比了決策樹與隨機森林兩種機器學習算法之間的異同及各自的優劣。
標籤:算法,初學者,分類,機器學習,Python,結構化數據,監督
用一個簡單的比喻來解釋決策樹 vs 隨機森林
讓我們從一個思維實驗來闡述決策樹和隨機森林之間的差異。
假設一個銀行要給一位顧客批准一筆小額貸款,銀行需要迅速做出決策。銀行檢查了這位顧客的信用記錄和他的財政狀況,並發現他還沒有還上之前的貸款。因此,銀行拒絕了他的申請。
但是,這筆貸款跟銀行所擁有的鉅額資金相比實在是小的可憐,銀行本可以輕易地批准這筆貸款並且也不會承擔很多風險。於是,銀行失去了一次賺錢的機會。
現在,銀行又來了一個貸款申請,但是這次銀行想出了一種不同的策略——多重決策過程。有時它會先檢查信用歷史,有時它會先檢查顧客的財政狀況和貸款額度。然後,銀行會把這些多重決策過程的結果進行整合,並最終決定是否將貸款發放給顧客。
即使這個過程比之前更費時,但是銀行依然能夠通過此途徑獲利。這是一個基於單一決策過程進行集合決策的經典案例。現在,我的問題來了——你知道這兩個過程表徵的是什麼嗎?
這裏是決策樹和隨機森林,我們將詳細探究這種觀點,深入挖掘兩種方法的主要差異,並且對關鍵問題進行回覆——你應該選擇那種機器學習算法?
目錄
決策樹簡介
隨機森林概覽
隨機森林和決策樹的衝突(代碼)
爲什麼隨機森林優於決策樹?
決策樹vs隨機森林——你應該在何時選擇何種算法?
決策樹簡介
決策樹是一種有監督的機器學習算法,該方法可以用於解決分類和迴歸問題。決策樹可以簡單地理解爲達到某一特定結果的一系列決策。這裏是一幅決策樹的闡述圖(使用我們上面的案例):
讓我們來理解這棵樹是如何工作的。
首先,它檢查了顧客是否有良好的信用歷史。基於此,它將顧客分爲兩組,也就是良好信用組和不良信用組。然後,它檢查了顧客的收入,並再次將顧客分爲兩類。最後,它檢查了顧客申請的貸款額度。基於這三種特徵的檢測,決策樹會決定是否通過顧客的貸款申請。
特徵/屬性和調節可能會隨着數據和問題複雜度的改變而改變,但是整體的理念是一致的。所以,一棵決策樹會基於一系列特徵做出一系列的決策,在本例中是信用歷史、收入和貸款額度。
現在,你可能會疑惑:
“爲什麼決策樹會先檢測信用得分而不是收入呢?”
特徵重要性和特質的檢測順序是基於如基尼不純度指數或信息增益等標準來決定的。這些概念的解釋不在本文所探討的範圍內,但是你可以通過以下的資料來學習決策樹相關知識:
基於樹的算法:從零開始的完整教程(R & Python)
https://www.analyticsvidhya.com/blog/2016/04/tree-based-algorithms-complete-tutorial-scratch-in-python/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
從決策樹開始(免費課程)
https://courses.analyticsvidhya.com/courses/getting-started-with-decision-trees?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
注:本文的想法是比較決策樹和隨機森林。因此,我不會詳細解釋基本概念,但是我將提供相關鏈接以便於你可以進一步探究。
隨機森林概覽
決策樹算法很容易理解和解釋。但是通常來說,一棵簡單的樹並不能產生有效的結果。這就是隨機森林算法的用武之地。
隨機森林是基於樹的機器學習算法,該算法利用了多棵決策樹的力量來進行決策。顧名思義,它是由一片樹木組成的“森林”!
但是爲什麼要稱其爲“隨機森林”呢?這是因爲它是隨機創造的決策樹組成的森林。決策樹中的每一個節點是特徵的一個隨機子集,用於計算輸出。隨機森林將單個決策樹的輸出整合起來生成最後的輸出結果。
簡單來說:
“隨機森林算法用多棵(隨機生成的)決策樹來生成最後的輸出結果。”
這種結合了多個單一模型的輸出(也被稱爲弱學習)的過程被稱爲集成學習。如果你想閱讀更多關於隨機森林和其他集成學習算法如何工作,請查閱一下文章:
從零開始構建一個隨機森林&理解真實世界的數據產品
https://www.analyticsvidhya.com/blog/2018/12/building-a-random-forest-from-scratch-understanding-real-world-data-products-ml-for-programmers-part-3/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
隨機森林超參數調優——一個初學者的指南
https://www.analyticsvidhya.com/blog/2020/03/beginners-guide-random-forest-hyperparameter-tuning/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
集成學習的綜合指南(使用Python代碼)
https://www.analyticsvidhya.com/blog/2018/06/comprehensive-guide-for-ensemble-models/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
如何在機器學習中建立集成模型?( R代碼)
https://www.analyticsvidhya.com/blog/2017/02/introduction-to-ensembling-along-with-implementation-in-r/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
現在的問題是,我們怎樣選擇決策樹和隨機森林算法呢?讓我們在做出結論之前,先看看過兩種算法的具體情況。
隨機森林和決策樹的衝突(代碼)
本部分,我們將使用Python實現決策樹和隨機森林算法來解決一道二分類問題。我們接下來將會比較它們的結果並看一看那種更適合解決我們的問題。
我們將基於Analytics Vidhya’s DataHack(https://datahack.analyticsvidhya.com/contest/practice-problem-loan-prediction-iii/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm)平臺的貸款預測數據集進行分析。這是一個二分類問題,我們需要基於特定的特徵集來決定一個人是否可被批准獲得貸款。
注:你可以去DataHack(https://datahack.analyticsvidhya.com/contest/all/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm )平臺並在不同在線機器學習競賽中與他人競爭,並且有機會獲得令人興奮的獎品。
準備好編程了嗎?
第一步:加載庫和數據集
讓我們從導入所需的Python庫和我們的數據集開始:
數據庫包括614列和13個特徵,包括信用歷史(credit history),婚姻狀況(marital status),貸款額度(loan amount),和性別(gender)。在這裏,目標變量是是否貸款(Loan_Status),該變量表明是否一個人能夠被批准獲得貸款。
第二步:數據預處理
現在到了任何數據科學項目中最爲關鍵的部分——數據預處理和特徵工程。本部分中,我將處理數據中的類別變量以及缺失值插補。
我將使用特定的模式對類別變量中的缺失值進行插補,並且對連續型變量用平均值插補(每列分別插補)。我們也將對類別變量進行標籤設置。你可以閱讀以下文章來了解更多關於標籤編碼的內容。
https://www.analyticsvidhya.com/blog/2016/07/practical-guide-data-preprocessing-python-scikit-learn/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
# Data Preprocessing and null values imputation
# Label Encoding
df['Gender']=df['Gender'].map({'Male':1,'Female':0})
df['Married']=df['Married'].map({'Yes':1,'No':0})
df['Education']=df['Education'].map({'Graduate':1,'Not Graduate':0})
df['Dependents'].replace('3+',3,inplace=True)
df['Self_Employed']=df['Self_Employed'].map({'Yes':1,'No':0})
df['Property_Area']=df['Property_Area'].map({'Semiurban':1,'Urban':2,'Rural':3})
df['Loan_Status']=df['Loan_Status'].map({'Y':1,'N':0})
#Null Value Imputation
rev_null=['Gender','Married','Dependents','Self_Employed','Credit_History','LoanAmount','Loan_Amount_Term']
df[rev_null]=df[rev_null].replace({np.nan:df['Gender'].mode(),
np.nan:df['Married'].mode(),
np.nan:df['Dependents'].mode(),
np.nan:df['Self_Employed'].mode(),
np.nan:df['Credit_History'].mode(),
np.nan:df['LoanAmount'].mean(),
np.nan:df['Loan_Amount_Term'].mean()})
rfc_vs_dt-2.py hosted with ❤ by GitHub
第三步:創造訓練集和測試集
現在,讓我們以80:20的比例進行訓練集和測試集的劃分:
X=df.drop(columns=['Loan_ID','Loan_Status']).values
Y=df['Loan_Status'].values
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size = 0.2, random_state = 42)
rfc_vs_dt-3.py hosted with ❤ by GitHub
讓我們一眼所劃分的訓練集和測試集:
print('Shape of X_train=>',X_train.shape)
print('Shape of X_test=>',X_test.shape)
print('Shape of Y_train=>',Y_train.shape)
print('Shape of Y_test=>',Y_test.shape)
rfc_vs_dt-4.py hosted with ❤ by GitHub
真棒!現在我們已經準備好進入下一個階段構建決策樹和隨機森林模型了!
第四步:構建和評估模型
既然我們已經有了訓練和測試集,是時候訓練模型和分類貸款申請了。首先,我們將在數據機上進行決策樹的訓練:
# Building Decision Tree
from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(criterion = 'entropy', random_state = 42)
dt.fit(X_train, Y_train)
dt_pred_train = dt.predict(X_train)
rfc_vs_dt-5.py hosted with ❤ by GitHub
接下來,我們將使用F1-Score對模型進行評估。F1-Score是由公式給出的精度和召回的調和平均數:
你可以通過以下文章來了解更多關於F1-Score和其他的評估方法:
https://www.analyticsvidhya.com/blog/2019/08/11-important-model-evaluation-error-metrics/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
讓我們來評價F1-Score模型的表現:
# Evaluation on Training set
dt_pred_train = dt.predict(X_train)
print('Training Set Evaluation F1-Score=>',f1_score(Y_train,dt_pred_train))
rfc_vs_dt-6.py hosted with ❤ by GitHub
# Evaluating on Test set
dt_pred_test = dt.predict(X_test)
print('Testing Set Evaluation F1-Score=>',f1_score(Y_test,dt_pred_test))
rfc_vs_dt-7.py hosted with ❤ by GitHub
在這裏,你可以看到決策樹在樣本內估計的表現非常好,但是在樣本外估計的表現迅速下降。爲什麼會出現這種情況呢?因爲我們的決策樹在訓練集上產生了過擬合。隨機森林能否解決這一問題?
建立隨機森林模型
讓我們來看一下隨機森林模型:
在這裏,我們可以清楚地看到在樣本外估計當中,隨機森林模型比決策樹的表現更優。讓我們在接下來的一部分當中來討論一下背後的原因。
# Building Random Forest Classifier
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier(criterion = 'entropy', random_state = 42)
rfc.fit(X_train, Y_train)
# Evaluating on Training set
rfc_pred_train = rfc.predict(X_train)
print('Training Set Evaluation F1-Score=>',f1_score(Y_train,rfc_pred_train))
rfc_vs_dt-8.py hosted with ❤ by GitHub
f1 score random forest
# Evaluating on Test set
rfc_pred_test = rfc.predict(X_test)
print('Testing Set Evaluation F1-Score=>',f1_score(Y_test,rfc_pred_test))
rfc_vs_dt-9.py hosted with ❤ by GitHub
爲什麼我們的隨機森林模型比決策樹表現更好?
隨機森林利用了多棵決策樹的優勢。它的確不依賴於單一決策樹的特徵重要性。讓我們來看一看不同算法給予不同特徵的特徵重要性。
feature_importance=pd.DataFrame({
'rfc':rfc.feature_importances_,
'dt':dt.feature_importances_
},index=df.drop(columns=['Loan_ID','Loan_Status']).columns)
feature_importance.sort_values(by='rfc',ascending=True,inplace=True)
index = np.arange(len(feature_importance))
fig, ax = plt.subplots(figsize=(18,8))
rfc_feature=ax.barh(index,feature_importance['rfc'],0.4,color='purple',label='Random Forest')
dt_feature=ax.barh(index+0.4,feature_importance['dt'],0.4,color='lightgreen',label='Decision Tree')
ax.set(yticks=index+0.4,yticklabels=feature_importance.index)
ax.legend()
plt.show()
rfc_vs_dt-10.py hosted with ❤ by GitHub
正如你在上圖所見,決策樹模型基於某一個特徵集很高的重要性。但是隨機森林算法在訓練過程中隨機選擇特徵。因此,的確不依賴於任何特定的特徵集。這是隨機森林算法優於bagging算法的一個特殊之處。你可以閱讀以下文章獲取更多bagging算法知識。
https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.BaggingClassifier.html#sklearn.ensemble.BaggingClassifier
因此,隨機森林可以更好地在數據中心進行泛化。隨機化特徵選擇可以使得隨機森林比決策樹更準確。
所以你應該選擇哪一種算法呢——決策樹還是隨機森林?
“隨機森林適用於擁有大型數據集的情況,並且可解釋性不是主要考慮因素。”
決策樹更容易解釋和理解。因爲隨機森林整合了多棵決策樹,更難以解釋。但是好消息是——解釋隨機森林也並非不可能。這裏有一篇文章講了如何解釋隨機森林模型的結果:
https://www.analyticsvidhya.com/blog/2019/08/decoding-black-box-step-by-step-guide-interpretable-machine-learning-models-python/?utm_source=blog&utm_medium=decision-tree-vs-random-forest-algorithm
並且,隨機森林比起單一決策樹需要更長的訓練時間。你應該把此納入考慮,因爲隨着決策樹數量的增加,所需要的訓練時間也會越長。在你面臨着緊張的機器學習項目安排過程中這可能通常是至關重要的。
但是我要說的是——儘管結果不穩定,且依賴於特定的特徵集,決策樹真的很有幫助,因爲他們更容易去解釋、訓練更快。任何對數據科學缺乏知識的人都可以使用決策樹進行快速的數據驅動決策。
寫在最後的話
瞭解決策樹和隨機森林之爭是非常有必要的。在你初入機器學習領域時,這可能是一個很棘手的問題,但是本文能夠爲你闡明兩者之間的異同。
原文標題:
Decision Tree vs. Random Forest – Which Algorithm Should you Use?
原文鏈接:
https://www.analyticsvidhya.com/blog/2020/05/decision-tree-vs-random-forest-algorithm/
編輯:王菁
校對:龔力
招聘信息
崗位: 開發運維工程師
職能:研發團隊支持——配合多個研發組,搭建、維護、優化Jenkins、禪道、數據庫、大數據平臺等,開發、支持持續集成(CI-CD)腳本和流程、軟件發佈管理,提高各個研發組的開發效率。深入研究運維相關技術以及新型軟硬件技術,包括運維自動化技術,虛擬化技術,監控技術,網絡技術等。對外提供數爲軟件系統的雲服務和培訓服務設施等。
招聘要求:本科學歷、帶有大數據系統(Hadoop、Kafka、ES、MongoDB、Jenkins等)使用經歷
入職單位: 清華大學軟件學院 大數據系統軟件國家工程實驗室 (工作地點:雙清大廈)
簡歷投遞地址:[email protected]
招聘日期:即日起至2020年7月16日
譯者簡介
陳超,北京大學應用心理碩士在讀。本科曾混跡於計算機專業,後又在心理學的道路上不懈求索。越來越發現數據分析和編程已然成爲了兩門必修的生存技能,因此在日常生活中盡一切努力更好地去接觸和了解相關知識,但前路漫漫,我仍在路上。
翻譯組招募信息
工作內容:需要一顆細緻的心,將選取好的外文文章翻譯成流暢的中文。如果你是數據科學/統計學/計算機類的留學生,或在海外從事相關工作,或對自己外語水平有信心的朋友歡迎加入翻譯小組。
你能得到:定期的翻譯培訓提高志願者的翻譯水平,提高對於數據科學前沿的認知,海外的朋友可以和國內技術應用發展保持聯繫,THU數據派產學研的背景爲志願者帶來好的發展機遇。
其他福利:來自於名企的數據科學工作者,北大清華以及海外等名校學生他們都將成爲你在翻譯小組的夥伴。
點擊文末“閱讀原文”加入數據派團隊~
轉載須知
如需轉載,請在開篇顯著位置註明作者和出處(轉自:數據派ID:DatapiTHU),並在文章結尾放置數據派醒目二維碼。有原創標識文章,請發送【文章名稱-待授權公衆號名稱及ID】至聯繫郵箱,申請白名單授權並按要求編輯。
發佈後請將鏈接反饋至聯繫郵箱(見下方)。未經許可的轉載以及改編者,我們將依法追究其法律責任。
點擊“閱讀原文”擁抱組織