從零開始學習機器學習
參考文章:http://juejin.cn/post/6844903805071392782#heading-3
什麼是機器學習
機器學習是根據大量現有的資料,找出一個基本擬合的函式(模型),並根據該函式對新資料進行預測、決策、分類等技術。
比如,現有資料:
| 身高 | 體重| | --- | --- | | 160 | 120| | 170 | 130| | 180 | 140|
假設身高=x,體重=y,最擬合的函式是 y = 1 * x + 40
那麼根據函式,我們預測身高=190的人,體重=150
以上例子是理想的情況,實際我們接觸的資料遠比它大,維度(列)也多,不能輕易地給出一個完全擬合的函式,但是我們仍然有辦法找到該函式,這個過程就是機器學習的過程。
開始練習
安裝環境
- pip3 install virtualenv
- virtualenv ai_python
- source ./ai_python/bin/activate
安裝依賴庫
- pip install numpy # 數值處理庫
- pip install pillow # 簡單的影象處理庫
- pip install --upgrade scikit-learn # 包含多種機器學習演算法的工具包
- pip install tensorflow # 深度學習庫
- pip install keras # 深度學習庫
- pip install opencv-contrib-python # 影象識別工具
- pip install --upgrade imutils # 影象處理庫
引入演算法庫
- KNN
- 樸素貝葉斯
- 邏輯迴歸
- SVM
- 決策樹
- 隨機森林
- 感知機
準備資料
鳶尾花資料集(部分),共計150條記錄,包含 setosa,versicolor,virginica 三種花型
| 葉片長度 | 葉片寬度 | 花瓣長度 | 花瓣寬度 | 鳶尾花型別 | | --- | --- | --- | --- | --- | | 5.1 | 3.5 | 1.4 | 0.2 | setosa | | 6.9 | 3.1 | 4.9 | 1.5 | versicolor | | 7.7 | 2.8 | 6.7 | 2.0 | virginica | | 6.1 | 3.0 | 4.9 | 1.8 | virginica | | 6.2 | 2.2 | 4.5 | 1.5 | versicolor |
測試
```python
coding: utf-8
from sklearn.neighbors import KNeighborsClassifier from sklearn.naive_bayes import GaussianNB from sklearn.linear_model import LogisticRegression from sklearn.svm import SVC from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier from sklearn.neural_network import MLPClassifier from sklearn.model_selection import train_test_split from sklearn.metrics import classification_report from sklearn.datasets import load_iris import argparse
根據引數選擇模型
ap = argparse.ArgumentParser() ap.add_argument("-m", "--model", type=str, default="knn", help="請輸入模型簡稱") args = vars(ap.parse_args())
models = { "knn": KNeighborsClassifier(n_neighbors=1), "naive_bayes": GaussianNB(), "logit": LogisticRegression(solver="lbfgs", multi_class="auto"), "svm": SVC(kernel="rbf", gamma="auto"), "decision_tree": DecisionTreeClassifier(), "random_forest": RandomForestClassifier(n_estimators=100), "mlp": MLPClassifier() }
載入鳶尾花資料集,然後進行訓練集和測試集的劃分,75%資料作為訓練集,其餘25%作為測試集
random_state是隨機狀態,類似隨機種子
print("載入鳶尾花資料集...") dataset = load_iris() (trainX, testX, trainY, testY) = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.25)
訓練模型
print("正在使用模型:'{}'".format(args["model"])) model = models[args["model"]] model.fit(trainX, trainY)
預測並輸出一份分類結果報告
print("生成結果報告") predictions = model.predict(testX) print(classification_report(testY, predictions, target_names=dataset.target_names)) ```
結果報告
報告解析
舉個例子,現有100人,專家預測大概30人為陽性,70人為陰性,現在有一個模型,在專家預測陽性的30人中,20人陽性,10人為陰性,在專家預測陰性的70人中,5人陽性,65人陰性。
- 預測正確 = 陽性樣本預測結果為陽,陰性樣本預測結果為陰 = T
- 預測錯誤 = 陽性樣本預測結果為陰,陰性樣本預測結果為陽 = F
- 正樣本數量 = 專家預測陽性的30人 = P
- 負樣本數量 = 專家預測陰性的70人 = N
- 正樣本中預測結果為正的數量 = 專家預測陽性樣本中預測結果為陽的數量 = TP
- 正樣本中預測結果為負的數量 = 專家預測陽性樣本中預測結果為陰的數量 = FP
- 負樣本中預測結果為正的數量 = 專家預測陰性樣本中預測結果為陽的數量 = FN
- 負樣本中預測結果為負的數量 = 專家預測陰性樣本中預測結果為陰的數量 = TN
- 準確率 = accuracy = (TP + TN) / (TP + FP + TN + FN)
- 精準率 = precision = TP / (TP + FP)
- 召回率 = recall = TP / (TP + FN)
- F1 = f1-score (2 * 精準率 * 召回率)/ (精準率 + 召回率)
- support = 預測時的樣本容量
- macro avg = 巨集平均 = 每個分類的精準率之和 / 分類數
- weighted avg = 加權平均 = ∑(分類的精準率*分類的support/總support)
一般看weighted avg 即可知道該模型預測的準確率