現在我們資料已經準備好了,也知道遇到模型無法處理的字串資料可以用哪些方法處理。接下來就來開train吧。相信已經很多人摩拳擦掌已久了吧。
接續一開始的Iris dataset來試試看tree這個模型能不能把它分類分好吧,首先我們照第一講的內容,先把資料載好
from sklearn.datasets import load_iris
data = load_iris()
columns = data['feature_names']
X = data['data']
y = data['target']
機器學習訓練最重要的就是:我們不能看著答案背答案,我們希望模型可以通過一部分的題目與答案學到一種答題技巧。接下來看見沒有看過的問題,也能通過"訓練期間"掌握的答題技巧來回答出正確的答案
所以我們需要分出training與testing 兩個資料集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
print(X_train.shape, y_train.shape)
準備好訓練資料接下來就可以開始訓練 下面示範tree 這個模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)
y_pred = tree.predict(X_test)
接下來就是評估模型能力的時間
我們可以通過confusion_matrix, classification_report 來衡量模型的水準
可以看到這個模型透過樹分類可以在測試集拿到完美的結果
左下角就是三個類別 在對角線上就是預測正確。
所以三種類別都讓模型全部答對了。好像沒有換模型的必要了(笑),不過我還是示範一下好了
想要新增SVM模型呢 也非常簡單
想使用xgboost也是pip install後用一樣的方式使用
pip install xgboost
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.svm import SVC
from xgboost import XGBClassifier
models = [
XGBClassifier(learning_rate =0.1,
n_estimators=1000,
max_depth=7,
min_child_weight=1,
gamma=0,
subsample=0.8,
colsample_bytree=0.8,
objective='multi:softprob', #'binary:logistic'
nthread=8,
eval_metric='auc',
seed=42),
SVC(),
DecisionTreeClassifier(),
RandomForestClassifier(),
]
for cls in models:
print('processing', cls)
cls.fit(X_train, y_train)
y_pred = cls.predict(X_test)
print(classification_report(y_test, y_pred, zero_division=1))
print(confusion_matrix(y_test, y_pred))
最終的code就如上所示,認真的孩子也許會問,怎麼其它模型都看起來很簡單,這個xgboost自己夾帶了好多私貨。 這些看起來很複雜長長一串的參數,就是後續進階課程會討論到的超參數調教的範疇,目前可以把這些值當作默認值先貼上。唯獨需要注意,這裡是多輸出的分類,所以我切換成objective=’multi:softprob’, 如果是binary的時候記得切換成後面那個,我也貼心的留在註解了。
說到binary,我們就拿tree與svc來介紹一下切換成binary model可以怎麼做吧
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
flower_types = ["Iris-Setosa", "Iris-Versicolour","Iris-Virginica"]
models = [SVC(), DecisionTreeClassifier()]
for cls in models:
print('processing', cls)
for flower_idx, flower_type in enumerate(flower_types):
print('processing', flower_type)
X_train, X_test, y_train, y_test = train_test_split(X, y==flower_idx, test_size=0.2, random_state=42)
cls.fit(X_train, y_train)
y_pred = cls.predict(X_test)
print(classification_report(y_test, y_pred, zero_division=1, target_names=['not_'+flower_type, flower_type]))
print(confusion_matrix(y_test, y_pred))
關鍵在於y==flower_idx這個命令,我僅找出label為我目前要train的row 標記為true, 其他我都標記為false.這樣就可以在for迴圈內輕鬆做出binary dataset
以上就是今天的內容,接下來下一篇再帶大家練習用今天學到的內容來訓練鐵達尼號資料集吧~