Machine Learning (10) - Decision Tree

Rachel發表於2019-06-09

引言

Machine Learning (10) - Decision Tree

對於上圖這樣一個資料集,我們可以很容易地使用 Logistic Regression 來畫出這條分界線。

但是,對於一些資料分佈更加隨意的資料集, 就要像下圖一樣,需要多條線來做分割,才能做到比較準確的分類。這時我們就需要 Desision Tree Algorithm 來幫我們完成這個工作。

Machine Learning (10) - Decision Tree

應用場景

從公司, 職位, 學歷三個維度衡量工資水平是否超過 100k,以下是草料:

Machine Learning (10) - Decision Tree

拿到這個需求, 首先都會在腦海裡做一個樹形分類:

Machine Learning (10) - Decision Tree

Machine Learning (10) - Decision Tree

Machine Learning (10) - Decision Tree

上面是以公司作為總維度來劃分的, 還可以嘗試以學歷為總維度來劃分, 都會得到不一樣的效果:

Machine Learning (10) - Decision Tree

但其實目前的資料是相對來說, 非常簡單的, 在實際應用中, 這個樹可能會有50層那麼高, 那就很難這樣呈現了. 所以這裡就可以用DecisionTreeClassifier 來完成這個工作.

如何使用

引入資料檔案

import pandas as pd
df = pd.read_csv('/Users/rachel/Downloads/py-master/ML/9_decision_tree/salaries.csv')
df

Machine Learning (10) - Decision Tree

轉換非數字列

由於 Machine Learning 只支援對數字的分析, 所以要把 company, job 和 degree 列的資料都轉成數字。這裡用的是 LabelEncoder, 雖然像 company 和 job 列都是 nominal 而非 ordinary, 但是由於我們要用的是 DecisionTreeClassifier, 所以可以用 LabelEncoder。

from sklearn.preprocessing import LabelEncoder
le_company = LabelEncoder()
le_job = LabelEncoder()
le_degree = LabelEncoder()

dfle = df
dfle.company = le_company.fit_transform(dfle.company)
dfle.job = le_job.fit_transform(dfle.job)
dfle.degree = le_degree.fit_transform(dfle.degree)
dfle.head()

Machine Learning (10) - Decision Tree

整理用於訓練模型的資料

inputs = dfle.drop('salary_more_then_100k', axis = 'columns')
target = dfle['salary_more_then_100k']

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(inputs, target, test_size = 0.3)

訓練模型

from sklearn import tree
model = tree.DecisionTreeClassifier()
model.fit(X_train, y_train)

相關文章