機器學習筆記一------線性分類器
阿新 • • 發佈:2019-01-07
線性模型,使用最小二乘引數估計使模型預測結果與實際結果y之間的均方誤差最小,得到引數w和b(其中b可以算作w的最後一列,對應屬性值恆置為1)。
線性模型形式簡單,易於建模,引入層級結構或高維對映後可得到更為搶到的非線性結構。為廣義線性模型,有加權最小二乘法或極大似然法進行引數估計。
對於二元分類問題,y的取值為0或1,假設不同類別訓練樣本數目相同,當預測的y值大於0.5認證為正,反之為負,y實際表達了正例的可能性,即,則為正例。若假設不成立,即類別不平衡問題,有三種解決方法:
(1) 對數目少的一類欠取樣,去除一部分後訓練,時間開銷小,但訓練樣本少
(2) 對數目多的一類過取樣,增加一部分後訓練,時間開銷大,訓練樣本多,不可簡單得重複取樣,會過擬合,可採用插值產生額外樣本。
(3) 用原始資料訓練,使用進行決策(m表示樣本個數)
程式碼實踐:使用邏輯迴歸和隨機梯度預測疾病
import pandas as pd import numpy as np # 建立特徵列表。 column_names = ['Sample code number', 'Clump Thickness', 'Uniformity ofCell Size', 'Uniformity of Cell Shape', 'Marginal Adhesion', 'Single EpithelialCell 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 # 使用sklearn.model_selection裡的train_test_split模組用於分割資料。 from sklearn.model_selection import train_test_split # 隨機取樣25%的資料用於測試,剩下的75%用於構建訓練集合。 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() # 查驗測試樣本的數量和類別分佈。 y_test.value_counts() # 從sklearn.preprocessing裡匯入StandardScaler。 from sklearn.preprocessing import StandardScaler # 從sklearn.linear_model裡匯入LogisticRegression與SGDClassifier。 from sklearn.linear_model import LogisticRegression from sklearn.linear_model import stochastic_gradient # 標準化資料,保證每個維度的特徵資料方差為1,均值為0。使得預測結果不會被某些維度過大的特徵值而主導。 ss = StandardScaler() X_train = ss.fit_transform(X_train) X_test = ss.transform(X_test) # 初始化LogisticRegression與SGDClassifier。 lr = LogisticRegression() sgdc = stochastic_gradient.SGDClassifier(max_iter=5) # 呼叫LogisticRegression中的fit函式/模組用來訓練模型引數。 lr.fit(X_train, y_train) # 使用訓練好的模型lr對X_test進行預測,結果儲存在變數lr_y_predict中。 lr_y_predict = lr.predict(X_test) # 呼叫SGDClassifier中的fit函式/模組用來訓練模型引數。 sgdc.fit(X_train, y_train) # 使用訓練好的模型sgdc對X_test進行預測,結果儲存在變數sgdc_y_predict中。 sgdc_y_predict = sgdc.predict(X_test) # 從sklearn.metrics裡匯入classification_report模組。 from sklearn.metrics import classification_report # 使用邏輯斯蒂迴歸模型自帶的評分函式score獲得模型在測試集上的準確性結果。 print ('Accuracy of LR Classifier:', lr.score(X_test, y_test)) # 利用classification_report模組獲得LogisticRegression其他三個指標的結果。 print (classification_report(y_test, lr_y_predict, target_names=['Benign','Malignant'])) # 使用隨機梯度下降模型自帶的評分函式score獲得模型在測試集上的準確性結果。 print ('Accuarcy of SGD Classifier:', sgdc.score(X_test, y_test)) # 利用classification_report模組獲得SGDClassifier其他三個指標的結果。 print (classification_report(y_test, sgdc_y_predict,target_names=['Benign', 'Malignant']))
--來自《Python機器學習及實踐 —— 從零開始通往Kaggle競賽之路》