前置知識
pandas
- 讀取文件:
read_csv
- 查看信息
describe
:查看整體信息,包括每列的平均值、最大最小值、標準差等head
:輸出頭部幾行數據columns
:輸出所有列名loc
:查詢數據,或是根據索引取對應的數據dropna
:去掉所有為空NA
的數據
Machine Learning
大體上來說,機器學習就是給定一部分數據,讓機器去“學習”這部分有什么特征,每個特征上有什么規律,以此形成一個模型model,然后用這個model去預測新的數據的結果
scikit-learn
簡單高效的python包,可用于可預測的數據分析,官網在這里,可以自行查閱相關模型的原理或是API
下面以決策樹模型的使用過程來大致展示一下機器學習的整體過程
決策樹:DecisionTree
非常簡單易懂的監督模型,可理解為給定一系列相關特征(比如n個),每個特征的結果只有兩個(不確定是不是只能有兩個),整個決策樹就像是二叉樹,預測時根據每個特征的是或否的回答選擇路徑,一次決策就像是二叉樹從根節點到某個葉子節點的一條路徑
可用于classification
(DecisionTreeClassifier)或是regression
(DecisionTreeRegressor)
訓練模型的整體流程:以回歸模型為例
- 準備數據:用
pandas
讀取數據,并挑選出所需要的特征列和想預測的目標列- 數據分離train_test_split:注意不要把所有數據都拿來用于訓練,要從中選出一部分數據用于驗證訓練出來的模型是否可信
import pandas as pd from sklearn.model_selection import train_test_split src_data = pd.read_csv('...') features = ['column_1', ...] X = src_data[features] # 特征列 y = src_data.target_column # 目標列 train_X, val_X, train_y, val_y = train_test_split(X, y, random_state = 0) # 分離成用于訓練的 train_... 和用于預測的 val_...
- 初始化模型:直接導入后創建即可
- 可指定隨機數種子
random_state
,相同的值能保證每次運行腳本時得到相同的結果
from sklearn.tree import DecisionTreeRegressor ... dt_model = DecisionTreeRegressor(random_state=N)
- 可指定隨機數種子
- 數據擬合fit:用訓練數據去訓練模型
dt_model.fit(train_X, train_y)
- 預測結果predict:用檢驗數據進行預測
predicted_data = dt_model.predict(val_X) # val_X: 用于預測的數據的特征列
- 評估結果:檢驗預測的結果與實際結果之間的差距,可以有不同的方法,在此僅介紹一種MAE
評估結果:mean_absolute_error(MAE)
計算方式為:依次計算預測結果與實際結果的差值的絕對值,最后求和后除以結果數量
即與實際結果間的平均差值
On average, our predictions are off by about X.
代碼也很簡單,導入后調用即可
from sklearn.metrics import mean_absolute_error
...
mean_absolute_error(y, predicted_data) # y: 實際結果
兩個問題
- 過擬合 overfitting:與訓練數據貼合得過于完美,可能會學到一些實際數據中并不存在的特性,導致預測結果與實際數據相差較大(就像是下圖豎線的右邊部分,訓練數據上的評估結果很好但實際表現不好)
- 欠擬合 underfitting:與訓練數據貼合得不夠,可能是特征學習得不足,導致不能很好地判定實際數據的特征,所以預測結果與實際數據相差也很大(就像下圖豎線的左邊部分,在兩個數據集上的表現都不好)
- 尋找最佳點:可通過梯度測試等方式,不斷調試參數,找到能讓在實際數據上的表現最好的參數(就像下圖的黃色感嘆號處)
決策樹的改進
- 控制樹高:樹高相關的參數可以說直接影響決策樹的效率和預測結果 —— 樹越高,對應的就是特征越多,則源數據被分化得越細致,對于每個部分的訓練數據都能進行貼合,但相應的每個葉子部分的數據就越少,也就是說對于該條路徑的訓練可能不夠,導致學習到的特征不夠貼合實際數據(過擬合);反之,則是源數據被分割的不夠,每個葉子節點都存在大量數據,對于特征的學習可能不夠細致(欠擬合)
- 創建模型的時候可以通過
max_leaf_node
指定葉子個數限制,或是max_depth
指定最大深度。那么經過測試不同葉子限制或是樹高的情況下MAE的值,選取使其到達最低點的參數進行創建模型,就能達到最佳效果
- 創建模型的時候可以通過
- 使用更復雜的模型(比如
隨機森林RandomForestRegressor
)from sklearn.ensemble import RandomForestRegressor