決策樹、隨機森林及代碼實戰

隨機森林訓練

視頻:https://www.bilibili.com/video/av50873926/

數據及源碼:

我們對訓練集採用隨機森林模型,並評估模型效果

%pylab inline
# 導入訓練集、驗證集和測試集

import pandas as pd

samtrain = pd.read_csv('samtrain.csv')
samval = pd.read_csv('samval.csv')
samtest = pd.read_csv('samtest.csv')

# 使用 sklearn的隨機森林模型,其模塊叫做 sklearn.ensemble.RandomForestClassifier

# 在這裏我們需要將標籤列 ('activity') 轉換爲整數表示,
# 因爲Python的RandomForest package需要這樣的格式。  

# 其對應關係如下:
# laying = 1, sitting = 2, standing = 3, walk = 4, walkup = 5, walkdown = 6
# 其代碼在 library randomforest.py 中。

import randomforests as rf
samtrain = rf.remap_col(samtrain,'activity')
samval = rf.remap_col(samval,'activity')
samtest = rf.remap_col(samtest,'activity')
Populating the interactive namespace from numpy and matplotlib
import sklearn.ensemble as sk
rfc = sk.RandomForestClassifier(n_estimators=500, oob_score=True)
train_data = samtrain[samtrain.columns[1:-2]]
train_truth = samtrain['activity']
model = rfc.fit(train_data, train_truth)
# 使用 OOB (out of band) 來對模型的精確度進行評估.
rfc.oob_score_
輸出
0.98174904942965779
# 用 "feature importance" 得分來看最重要的10個特徵
fi = enumerate(rfc.feature_importances_)
cols = samtrain.columns
[(value,cols[i]) for (i,value) in fi if value > 0.04]
## 這個值0.4是我們通過經驗選取的,它恰好能夠提供10個最好的特徵。
## 改變這個值的大小可以得到不同數量的特徵。
## 下面這句命令是防止你修改參數弄亂了後回不來的命令備份。
## [(value,cols[i]) for (i,value) in fi if value > 0.04]
輸出
[(0.048788075395111638, 'tAccMean'),
 (0.044887862923922571, 'tAccStd'),
 (0.044231502495174914, 'tJerkMean'),
 (0.04892499919665521, 'tGyroJerkMagSD'),
 (0.058161561399143025, 'fAccMean'),
 (0.0448666616780896, 'fJerkSD'),
 (0.14045995765086935, 'angleGyroJerkGravity'),
 (0.16538335816293095, 'angleXGravity'),
 (0.047154808012715918, 'angleYGravity')]

我們對驗證集和測試集使用predict()方法,並得到相應的誤差。

# 因爲pandas的 data frame 在第0列增加了一個假的未知列,所以我們從第1列開始。
# not using subject column, activity ie target is in last columns hence -2 i.e dropping last 2 cols

val_data = samval[samval.columns[1:-2]]
val_truth = samval['activity']
val_pred = rfc.predict(val_data)

test_data = samtest[samtest.columns[1:-2]]
test_truth = samtest['activity']
test_pred = rfc.predict(test_data)

輸出誤差

print("mean accuracy score for validation set = %f" %(rfc.score(val_data, val_truth)))
print("mean accuracy score for test set = %f" %(rfc.score(test_data, test_truth)))
mean accuracy score for validation set = 0.834911
mean accuracy score for test set = 0.900337
# 使用混淆矩陣來觀察哪些活動被錯誤分類了。
# 詳細說明請看 [5]
import sklearn.metrics as skm
test_cm = skm.confusion_matrix(test_truth,test_pred)
test_cm
array([[293,   0,   0,   0,   0,   0],
       [  0, 224,  40,   0,   0,   0],
       [  0,  29, 254,   0,   0,   0],
       [  0,   0,   0, 197,  26,   6],
       [  0,   0,  16,   1, 173,  26],
       [  0,   0,   0,   3,  14, 183]])

# 混淆矩陣可視化

import pylab as pl
pl.matshow(test_cm)
pl.title('Confusion matrix for test data')
pl.colorbar()
pl.show()

# 計算一下其他的對預測效果的評估指標
# Accuracy
print("Accuracy = %f" %(skm.accuracy_score(test_truth,test_pred)))
Accuracy = 0.900337
# Precision
print("Precision = %f" %(skm.precision_score(test_truth,test_pred)))
# Recall
print("Recall = %f" %(skm.recall_score(test_truth,test_pred)))
# F1 Score
print("F1 score = %f" %(skm.f1_score(test_truth,test_pred)))
Precision = 0.902996
Recall = 0.900337
F1 score = 0.900621
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章