2.1監督學習經典模型
監督學習:
2.1.1分類學習
二分類:從兩個類別中選擇一個作為預測結果。
多類分類:多于兩個類別中選擇一個。
多標簽分類:一個樣本是否同時屬于多個不同類別。
2.1.1.1線性分類器(linear classifier)
模型介紹:是一種假設特征與分類結果存在線性關系的模型。這個模型通過累加計算每個維度的特征與各自權重的乘積來幫助類別決策。
我們所要處理的最簡單的二分類問題數據f屬于{0,1};因此需要一個函數把原先的f屬于R映射到{0,1}。于是我們想到了邏輯斯蒂函數。
我們可以觀察到該模型如何處理一個待分類的特征向量:如果z=0,那么g=0.5;若z<0則g<0.5,這個特征向量被判別為一類;反之,若z>0,則g>0.5,其被歸為另外一類。
數據描述
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:類型。2-良性,4-惡性
數據:共699條,良性腫瘤458條(65.5%),惡性腫瘤241條(34.5%),16條缺失值(?標出)。
數據預處理
import pandas as pd
import numpy as np
#創建特征列表
column_names=['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']
#使用pandas.read_csv函數從互聯網讀取指定函數
data=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data',names=column_names)
#將?替換為標準缺失值表示
data=data.replace(to_replace='?',value=np.nan)
#丟棄帶有缺失值的數據(只要有一個維度有缺失)
data=data.dropna(how='any')
#輸出data的數據量和維度
data.shape
(683, 11)
訓練、測試數據
#使用sklearn.cross_valiation里的train_test_split模塊用于分割數據
from sklearn.cross_validation import train_test_split
#隨機采樣25%的數據用于測試,剩下的75%用于構建訓練集合,設置 random_state 可以讓每次劃分訓練集和驗證集的時候都是完全一樣的
X_train,X_test,y_train,y_test=train_test_split(data[column_names[1:10]],data[column_names[10]],test_size=0.25,random_state=33)
#查驗訓練樣本的數量和類別分布
y_train.value_counts()
2 344
4 168
Name: Class, dtype: int64
#查驗測試樣本的數量和類別分布,683*0.25=171
y_test.value_counts()
2 100
4 71
Name: Class, dtype: int64
預測任務
from sklearn.preprocessing import StandardScaler
#標準化數據,保證每個維度的特征數據方差為1,均值為0.使得預測結果不會被某些維度過大的特征值而主導
ss=StandardScaler()
X_train=ss.fit_transform(X_train)
X_test=ss.transform(X_test)
LogisticRegression預測任務
from sklearn.linear_model import LogisticRegression
#初始化LogisticRregression
lr=LogisticRegression()
#調用LogisticRegression中的fit函數/模塊用來訓練模型參數
lr.fit(X_train,y_train)
#使用訓練好的模型lr對X_test進行預測,結果儲存在變量lr_y_predict中。
lr_y_predict=lr.predict(X_test)
SGDClassifier預測任務
from sklearn.linear_model import SGDClassifier
#初始化SGDClassifier
sgdc=SGDClassifier()
#調用SGDClassifier中的fit函數/模塊用來訓練模型參數
sgdc.fit(X_train,y_train)
#使用訓練好的模型lr對X_test進行預測,結果儲存在變量sgdc_y_predict中。
sgdc_y_predict=sgdc.predict(X_test)
性能測評
定義:
惡性腫瘤為陽性positive
良性腫瘤為陰性negative
真陽性true positive
假陽性false positive
真陰性true negative
假陰性false negative
評價指標:
精確性,對于給定的測試數據集,分類器正確分類的樣本數與總樣本數之比。
accuracy = (TP + TN) / (TP + FP + TN + FN)
精確率,所有"正確被檢索的item(TP)"占所有"實際被檢索到的(TP+FP)"的比例。
precision = TP / (TP + FP)
召回率,所有"正確被檢索的item(TP)"占所有"應該檢索到的item(TP+FN)"的比例。
recall = TP / (TP + FN)
F1指標,精確值和召回率的調和均值
F1 Score = 2P*R/(P+R),其中P和R分別為 precision 和 recall
預測任務的性能分析
from sklearn.metrics import classification_report
使用邏輯斯蒂回歸模型自帶的評分函數score獲得模型在測試集上的準確性結果
print('Accuracy of LR Classifier:',lr.score(X_test,y_test))
Accuracy of LR Classifier: 0.988304093567
#利用classification_report模塊獲得LogisticRegression其他三個指標的結果
print(classification_report(y_test,lr_y_predict,target_names=['Benign','Malignant']))
#使用隨機梯度下降模型自帶的評分函數score獲得模型在測試集上的準確性結果
print('Accuracy of LR Classifier:',sgdc.score(X_test,y_test))
Accuracy of LR Classifier: 0.964912280702
#利用classification_report模塊獲得SGDClassifier其他三個指標的結果
print(classification_report(y_test,sgdc_y_predict,target_names=['Benign','Malignant']))
question:最后兩步的結果每次都不一樣???
特點分析
線性分類器可以說是最基本和最常用的機器學習模型。盡管受限于數據特征與分類目標之間的線性假設,我們仍然可以在科學研究與工程實踐中把線性分類器的表現性能作為基準。
LogisticRegression:對參數的計算采用精確解析的方式,計算時間長但是模型性能高。
SGDClassifier:采用隨機梯度上升算法估計模型參數,計算時間短但是產出的模型性能低。適用于對于訓練數據規模在10萬量級以上的數據,考慮到時間的耗用,筆者更加推薦使用隨機梯度算法對模型參數進行估計。
參考資料https://wenku.baidu.com/view/fe7e334d482fb4daa58d4b97.html