1. sklearn簡介
sklearn是機器學習中一個常用的python第三方模塊,網址:http://scikit-learn.org/stable/index.html ,里面對一些常用的機器學習方法進行了封裝,在進行機器學習任務時,並不需要每個人都實現所有的算法,只需要簡單的調用sklearn里的模塊就可以實現大多數機器學習任務。

庫的算法主要有四類:分類,回歸,聚類,降維。其中:
常用的回歸:線性、決策樹、SVM、KNN ;集成回歸:隨機森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
常用的分類:線性、決策樹、SVM、KNN,朴素貝葉斯;集成分類:隨機森林、Adaboost、GradientBoosting、Bagging、ExtraTrees
常用聚類:k均值(K-means)、層次聚類(Hierarchical clustering)、DBSCAN
常用降維:LinearDiscriminantAnalysis、PCA
2. 名詞說明

P=TP+FNP=TP+FN, N=TN+FPN=TN+FP

可以看到,recall 體現了分類模型HH對正樣本的識別能力,recall 越高,說明模型對正樣本的識別能力越強,precision 體現了模型對負樣本的區分能力,precision越高,說明模型對負樣本的區分能力越強。F1-score 是兩者的綜合。F1-score 越高,說明分類模型越穩健。

可以看到,當 β=1β=1,那么FβFβ就退回到F1F1了,ββ 其實反映了模型分類能力的偏好,β>1β>1 的時候,precision的權重更大,為了提高FβFβ,我們希望precision 越小,而recall 應該越大,說明模型更偏好於提升recall,意味着模型更看重對正樣本的識別能力; 而 β<1β<1 的時候,recall 的權重更大,因此,我們希望recall越小,而precision越大,模型更偏好於提升precision,意味着模型更看重對負樣本的區分能力。
3.例子1:實現線性分類器
樣本:
https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data

csv文件形式:

#coding=utf-8
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import stochastic_gradient
from sklearn.metrics import classification_report
#1.數據獲取
#創建特征列表
#'樣品代碼編號','團塊厚度','細胞大小均勻性', '細胞形狀的均勻性','邊緣粘附','單個上皮細胞大小',...'種類'
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)
#打印信息
print data.info() #查看詳細信息
print data.head() #查看部分信息
print data.shape #(699, 11)
#2.數據預處理:缺失值,標准化
#替換和去除缺失值
data=data.replace(to_replace='?',value=np.nan) # 將?代換為標准缺失值表示 nan
data=data.dropna(how='any') # 丟棄帶有缺失值的數據(只要有一個緯度有缺失)
print data.shape #(683, 11)
## 隨機采用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) #編號沒有進入訓練
#標准化數據,保證每個維度的特征數據方差為1,均值為0。使得預測結果不會被某些維度過大的特征值而主導。
ss = StandardScaler()
X_train = ss.fit_transform(X_train)
X_test=ss.transform(X_test)
#3.使用邏輯斯蒂回歸
lr = LogisticRegression() # 初始化LogisticRegression
lr.fit(X_train,y_train) # 使用訓練集對測試集進行訓練
lr_y_predit=lr.predict(X_test) # 使用邏輯回歸函數對測試集進行預測
print ('Accuracy of LR Classifier:%f'%lr.score(X_test,y_test)) # 使得邏輯回歸模型自帶的評分函數score獲得模型在測試集上的准確性結果
print classification_report(y_test,lr_y_predit,target_names=['Benign','Malignant']) #良性,惡性
#4.使用邏輯斯蒂回歸(基於隨機梯度下降法SGD)
sgdc=stochastic_gradient.SGDClassifier(max_iter=5) # 初始化分類器
sgdc.fit(X_train,y_train)
sgdc_y_predit=sgdc.predict(X_test)
print 'Accuarcy of SGD Classifier:', sgdc.score(X_test, y_test)
print classification_report(y_test,sgdc_y_predit,target_names=['Benign','Malignant'])
運行結果(第3,4部分):

4.例子2:實現SVM對手寫數字的識別
#coding=utf-8
from sklearn.datasets import load_digits # 從skleran.datasets里有導入手寫體數字加載器
from sklearn.model_selection import train_test_split #導入train_test_split用於數據分割
from sklearn.preprocessing import StandardScaler # 導入標准化數據
from sklearn.svm import LinearSVC # 從sklearn.svm中導入基於現行假設的支持向量機分類器LinearSVC
from sklearn.metrics import classification_report
#1.數據獲取
digits = load_digits() #從通過數據加載器獲得手寫數字的數碼圖像數據並存儲在digits中
print digits.data.shape # 檢視數據規模和數據緯度
#2.數據預處理:訓練集測試集分割,數據標准化
X_train,X_test,y_train,y_test = train_test_split(digits.data,digits.target,test_size=0.25,random_state=33)
print X_train
print y_train
print y_train.shape
ss = StandardScaler() # 對測試集和訓練集進行標准化
X_train = ss.fit_transform(X_train)
X_test = ss.transform(X_test)
#3.使用SVM訓練
lsvc = LinearSVC() # 初始化現行假設的支持向量機分類器 LinearSVC
lsvc.fit(X_train,y_train) # 進行模型訓練
y_predict = lsvc.predict(X_test)
#4.生成結果報告
print ('The Accuracy of Linear SVC is %f'%lsvc.score(X_test,y_test)) # 使用自帶的模型評估函數進行准確性評測
print classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)) # 使用sklearn.metrics里面的classification_report模塊對預測結果做更加詳細的分析
運行結果:

