引言
對於上圖這樣一個資料集,我們可以很容易地使用 Logistic Regression 來畫出這條分界線。
但是,對於一些資料分佈更加隨意的資料集, 就要像下圖一樣,需要多條線來做分割,才能做到比較準確的分類。這時我們就需要 Desision Tree Algorithm 來幫我們完成這個工作。
應用場景
從公司, 職位, 學歷三個維度衡量工資水平是否超過 100k,以下是草料:
拿到這個需求, 首先都會在腦海裡做一個樹形分類:
上面是以公司作為總維度來劃分的, 還可以嘗試以學歷為總維度來劃分, 都會得到不一樣的效果:
但其實目前的資料是相對來說, 非常簡單的, 在實際應用中, 這個樹可能會有50層那麼高, 那就很難這樣呈現了. 所以這裡就可以用DecisionTreeClassifier
來完成這個工作.
如何使用
引入資料檔案
import pandas as pd
df = pd.read_csv('/Users/rachel/Downloads/py-master/ML/9_decision_tree/salaries.csv')
df
轉換非數字列
由於 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()
整理用於訓練模型的資料
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)