機器學習篇(六)
- 2019 年 10 月 6 日
- 筆記
當把模型訓練好以後就不會再使用訓練集來預測,而是要實際去預測。這就涉及到模型的載入和保存。
需要用到的模組:
sklearn.externals.joblib
保存:joblib.dump()
載入:joblib.load()
以機器學習篇(五)中的線性回歸為例,保存這個模型.
保存和載入都有兩個參數:
第一個參數:演算法(這裡是線性回歸演算法,我的命名為lr)
第二個參數:保存的文件./test.pkl,就是保存到當前目錄名字為test.pkl,結尾必須是pkl。
比如保存:
# 導入模型的載入和保存模組
from sklearn.externals import joblib
# 保存模型
joblib.dump(lr,"./test.pkl")
# 使用(載入)
lr_demo = joblib.load("./test.pkl")
# 預測(注意:可能你預測的數據集需要標準化處理)
y_predict = lr_demo.predict("預測的數據集")
邏輯回歸
注意:邏輯回歸其實是分類演算法。
邏輯回歸長用於:廣告點擊,是否為垃圾郵件等等。
不管是廣告點擊還是是否為垃圾郵箱,這些都是簡單的二分類問題.也就是說邏輯回歸擅長於二分類問題。
邏輯回歸的公式和線性回歸公式是一樣的。所以線性回歸中的問題,在邏輯回歸中一樣會遇見。
比如過擬合等。邏輯回歸將一個線性回歸的輸入轉換成了一個分類問題。這就是邏輯回歸的核心。
這個核心叫做sigmoid函數。
sigmoid函數的樣子:

sigmoid函數將閑心回歸的輸入轉變成了0~1之間的值。這就轉換成了概率問題。
該函數具有如下的特性:當x趨近於負無窮時,y趨近於0;當x趨近於正無窮時,y趨近於1;
當x= 0時,y=0.5.
也就是說將回歸函數的值通過sigmoid函數映射成0~1之間的值就轉換成了概率問題也就是分類問題。
由於邏輯回歸和線性回歸原理一樣,但是由於轉變成了分類問題,算是函數不一樣,並且只能用梯度下降求解。
在邏輯回歸中使用的損失函數是:對數似然損失函數。
對數似然損失函數的值越小,說明預測的類別準確率就越高。
邏輯回歸模組:
sklearn.linear_model.LogisticRegression(penalty="l2",C=1.0)
參數一:penalty:正則化
參數二:C:正則化力度
通過正則化來解決過擬合。
實例:
預測是否患有癌症。在邏輯回歸中以概率小的那個特徵為依據,比如是否患有癌症,會算出
沒有患癌症的概率計算出來。
數據來源:http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/
數據屬性:

# 導入線性回歸演算法 from sklearn.linear_model import LogisticRegression # 導入分割數據集 from sklearn.model_selection import train_test_split # 導入標準化 from sklearn.preprocessing import StandardScaler # 導入召回率 from sklearn.metrics import classification_report import pandas as pd import numpy as np def logistic(): ''' 邏輯回歸二分類癌症預測 ''' # 讀取數據,由於數據沒有特徵值,這裡需要自己指定 # 構造特徵值名字 column = ['Sample code number','Clump Thickness','Uniformity of Cell Size','Uniformity of Cell Shape','Marginal Adhesion','Single Epithelial Cell Size','Bare Nuclei','Bland Chromatin','Normal Nucleoli','Mitoses','Class'] # 讀取 data = pd.read_csv("http://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data",names =column) # 缺失值處理,替換?號 data = data.replace(to_replace="?",value=np.nan) # 刪除處理或者填充數據(這裡刪除) data = data.dropna() # 數據分割 x_train,x_test,y_train,y_test = train_test_split(data[column[1:10]],data[column[10]],test_size=0.25) # 標準化處理,這裡目標值不需要標準化處理 std = StandardScaler() x_train = std.fit_transform(x_train) x_test = std.transform(x_test) # 邏輯回歸預測 lg = LogisticRegression(C=1.0) lg.fit(x_train,y_train) # 列印權重參數 print(lg.coef_) # 預測值為 y_predict = lg.predict(x_test) print("準確率為:",lg.score(x_test,y_test)) ''' [[1.03074162 0.33234542 1.0138588 0.5920222 0.27032191 1.283624 0.82755548 0.6176474 0.99989529]] 準確率為: 0.9590643274853801 ''' # 召回率 print("召回率為:",classification_report(y_test,y_predict,labels=[2,4],target_names=["良性","惡性"])) ''' 召回率為: precision recall f1-score support 良性 0.97 0.96 0.97 113 惡性 0.93 0.95 0.94 58 micro avg 0.96 0.96 0.96 171 macro avg 0.95 0.96 0.95 171 weighted avg 0.96 0.96 0.96 171 通過召回率可以看到:惡性的召回率只有95%。 ''' if __name__ == "__main__": logistic()
優點:適合需要得到分類概率的問題,簡單,速度快
缺點:不好處理多分類問題