機器學習入門——邏輯回歸
從qq音樂推薦系統談起
生活在大數據時代,每個人都是數據的組成部分。就比如我們每天都使用的淘寶、qq音樂、豆瓣等,都有特定的內部推薦演算法, 對於判斷用戶是否喜歡一首歌,是否喜歡一件商品都是分類問題。
區別於回歸問題,分類問題關鍵是找到決策邊界,然後輸入特點(featrues),得到分類(labels)。
通過得到的決策邊界判斷分類,根據正確率來確定分類結果的正確性。
正確率是指正確的個數占數據總數的百分比。
邏輯回歸:
本質上用於二分分類的演算法,結果只會有兩種情況。
這裡結合實際案例來學習:
1.導入數據
import pandas as pdfrom collections import OrderedDict#數據集examDict={ 學習時間:[0.50,0.75,1.00,1.25,1.50,1.75,1.75,2.00,2.25,2.50, 2.75,3.00,3.25,3.50,4.00,4.25,4.50,4.75,5.00,5.50], 通過考試:[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1]}examOrderDict=OrderedDict(examDict)examDf=pd.DataFrame(examOrderDict)
2.觀察散點圖
首先做出數據集的散點圖,觀察數據分布:
exam_x = examDf[學習時間]exam_y = examDf[通過考試]import matplotlib.pyplot as pltplt.scatter(exam_x, exam_y)plt.xlabel(learning label)plt.ylabel(passing the exam)plt.show()
這樣的分布顯然不符合線性回歸模型,可以看到明顯的兩極分化,代表這考試通過與否只有兩種情況。
3.確定模型
邏輯函數:
如果我們仍然按照線性回歸的方法擬合,並且設定一個閾值,左右分別是兩種情況。但是由於線性回歸是連續的,一些特殊值的出現就會影響擬合曲線的斜率,造成最終結果的差錯。
在這樣的場景下,邏輯回歸就誕生了。它的核心思想是,如果線性回歸的結果輸出是一個連續值,而值的範圍是無法限定的,那我們有沒有辦法把這個結果值映射為可以幫助我們判斷的結果呢。而如果輸出結果是 (0,1) 的一個概率值,這個問題就很清楚了。我們在數學上找了一圈,還真就找著這樣一個簡單的函數了,就是很神奇的sigmoid函數。
通過邏輯函數可以將y值控制在0和1之間。
因為參數z是回歸函數,所以叫做邏輯回歸。
邏輯函數的值全部在(0, 1)之間,並且是正相關的函數,在橫坐標為0處函數為1/2 。
也因此對應的線性方程y>=0時候,邏輯函數值大於0.5,規定結果為通過。所以y<=0規定結果為不通過。所以問題就簡化為線性方程的零值問題。
python實現如下:
首先將數據分為訓練數據集和測試數據集
from sklearn.cross_validation import train_test_splitexam_x_train, exam_x_test, exam_y_train, exam_y_test = train_test_split(exam_x, exam_y, train_size=.8)print(原始數據特徵:,exam_x.shape , ,訓練數據特徵:, exam_x_train.shape , ,測試數據特徵:,exam_x_test.shape )print(原始數據標籤:,exam_y.shape , 訓練數據標籤:, exam_y_train.shape , 測試數據標籤: ,exam_y_test.shape)
原始數據特徵: (20,) ,訓練數據特徵: (16,) ,測試數據特徵: (4,)
原始數據標籤: (20,) 訓練數據標籤: (16,) 測試數據標籤: (4,)與線性回歸分析過程類似的需要將一維數據轉換為六行一列的數據
exam_x_train = exam_x_train.values.reshape(-1,1)exam_x_test = exam_x_test.values.reshape(-1, 1)exam_y_test = exam_y_test.values.reshape(-1, 1)exam_y_train = exam_y_train.values.reshape(-1, 1)
使用sklearn中的logistics演算法
from sklearn.linear_model import LogisticRegressionmodel = LogisticRegression()model.fit(exam_x_train, exam_y_train)
因為數據量過小的原因,得到的模型並不是很準確,因此每次運行得到的可以用回歸解釋率(也就是score)都不一樣,嘗試之後得到的有0,1,0.25等值。
model.score(exam_x_test, exam_y_test)
這裡嘗試預測某一個特定值,即在一個學習時間下,通過考試的概率。
In [88]:model.predict_proba(3)#得到的數組,分別表示通過考試的概率和不通過考試的概率Out[88]:array([[ 0.36862634, 0.63137366]])In [31]:model.predict([[3]])#根據模型推測的可能性Out[31]:array([1], dtype=int64)
關於邏輯函數的詳細驗證,會在之後的泰坦尼克號的實踐中驗證。
最後是關於邏輯函數的python實現及理解:
import numpy as npa = model.coef_b = model.intercept_x = 3z = a*x + by_pred = 1/(1+ np.exp(-z))print(經過實踐的預測值:, y_pred)print(sklearn的預測值:, model.predict_proba(3)[0][1])
經過實踐的預測值: [[ 0.63137366]]
sklearn的預測值: 0.631373662661經過實際運算與sklearn的預測值是相同的。
分類與回歸的異同:
回歸是定量的,輸出值連續的,可以用平滑的曲線來擬合,因此回歸的關鍵就是找到最佳擬合曲線,評價的標準也不相同,例如對於簡單線性回歸來說,是SSE和r平方;
分類是定性的,輸出值是離散的,只能夠找到決策面來判斷,一次分類的關鍵就是找到決策面,對於分類,評價的標準就是準確率的大小。
三種數據類型的異同:
數值數據:連續;
分類數據:不連續,往往只有兩個或者特定的幾個輸出值;
時間序列:一段時間內定期收集的數據集。例如股票股價;與數值和分類數據區別就是能夠說明時間順序。
本文中加入了一些自己的理解,如果有錯誤,歡迎指教。
推薦閱讀: