機器學習-使用邏輯回歸分類
機器學習是很博大精深的,除了我們上一次說的線性回歸,還有一類重要的回歸就是邏輯回歸。邏輯回歸其實用於二分分類問題,用於判斷一個離散性的特徵得到的標籤類型的概率。
嗯,我知道你沒有聽懂,我舉個例子吧。你是否喜歡一首歌是通過很多這個歌的特徵(如節奏、強度等)來判斷的,那麼我們的數據集就是各種歌的特徵,而返回的結果則是一個非1即0,不是喜歡就是不喜歡的結果。這個情況大概是這樣:
而機器學習可以做到什麼呢?它會通過模型形成一個決策面,在你喜歡和不喜歡的歌之間划出一條分界線,就像這樣:
你是不是覺得:不對啊,上次的模型不是給出的一個線性的圖嗎?嗯,我知道你還沒死心。下面給你看一個例子吧。
先建立一個數據集:
簡單起見,我們只提供了一個特徵和一個標籤。如果畫圖的話大概就是這樣:
可以看到,擬合線已經無法很好的表示結果了,這時候就是使用邏輯回歸來分類的時候了。那麼,什麼是邏輯函數呢?
其中,z是一個線性回歸函數,也因此我們的邏輯回歸才叫回歸,其實它是一個二分分類函數。而在本例中,我們只考慮一個特徵(即學習時間),我們的z函數就是線性回歸函數。
這裡使用線性回歸函數是因為例子中只有一個特徵值(即學習時間),和之前線性回歸案例裡面的函數一樣,但是求函數的方法不同。這裡使用決策面來決定函數的參數:
當帶入函數值>=0.5時,標籤為1,否則為0,這麼一來我們就可以得到一個和概率相關的函數:
這個函數就是我們建立的模型,也就可以得到不同時間通過考試的概率了。
使用python實現邏輯回歸
知道了原理,我們來看代碼是如何實現的吧。首先建立數據集:
from collections import OrderedDictimport pandas as pd#數據集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)
然後提取特徵和標籤
#特徵featuresexam_X=examDf.loc[:,學習時間]#標籤labesexam_y=examDf.loc[:,通過考試]
繪製散點圖觀察數據
import matplotlib.pyplot as plt#散點圖plt.scatter(exam_X, exam_y, color="b", label="exam data")#添加圖標標籤plt.xlabel("Hours")plt.ylabel("Pass")#顯示圖像plt.show()
建立訓練數據集和測試數據集
train_test_split是交叉驗證中常用的函數,功能是從樣本中隨機的按比例選取訓練數據(train)和測試數據(test)第一個參數:所要劃分的樣本特徵第2個參數:所要劃分的樣本標籤train_size:訓練數據佔比,如果是整數的話就是樣本的數量from sklearn.cross_validation import train_test_split#建立訓練數據和測試數據X_train , X_test , y_train , y_test = train_test_split(exam_X , exam_y , train_size = .8)#輸出數據大小print(原始數據特徵:,exam_X.shape , ,訓練數據特徵:, X_train.shape , ,測試數據特徵:,X_test.shape )print(原始數據標籤:,exam_y.shape , 訓練數據標籤:, y_train.shape , 測試數據標籤: ,y_test.shape)
再繪製散點圖可以看到不同的數據的位置
#繪製散點圖import matplotlib.pyplot as plt#散點圖plt.scatter(X_train, y_train, color="blue", label="train data")plt.scatter(X_test, y_test, color="red", label="test data")#添加圖標標籤plt.legend(loc=2)plt.xlabel("Hours")plt.ylabel("Pass")#顯示圖像plt.show()
訓練模型
和線性擬合一樣,這裡需要先將數據reshape
理解了reshape後,我們再來看下邏輯回歸模型sklearn要求輸入的特徵必須是二維數組的類型,但是因為我們目前只有1個特徵,所以需要用安裝錯誤提示用reshape轉行成二維數組的類型。錯誤提示信息:Reshape your data either using array.reshape(-1, 1) if your data has a single feature#將訓練數據特徵轉換成二維數組XX行*1列X_train=X_train.values.reshape(-1,1)#將測試數據特徵轉換成二維數組行數*1列X_test=X_test.values.reshape(-1,1)#導入邏輯回歸包from sklearn.linear_model import LogisticRegression# 創建模型:邏輯回歸model = LogisticRegression()#訓練模型model.fit(X_train , y_train)
評估模型
還記得嗎?評估模型使用測試數據,這裡得到的是準確率
#評估模型:準確率model.score(X_test , y_test)
我得到的結果是1,嗯,挺好的。
除了上面這些,我們還可以通過幾段代碼進一步了解邏輯回歸:
#獲取概率值#第1個值是標籤為0的概率值,第2個值是標籤為1的概率值model.predict_proba(3)
注意,這裡的3其實是一個二維數組哦,你也可以寫成:
#獲取概率值#第1個值是標籤為0的概率值,第2個值是標籤為1的概率值model.predict_proba([[3]])
除了看到概率值,還可以直接得到標籤的值哦。
#預測數據:使用模型的predict方法可以進行預測。這裡我們輸入學生的特徵學習時間3小時,模型返回結果標籤是1,就代表預測該學生通過考試。pred=model.predict(3)#或者pred=model.predict([[3]])print(pred)
不知道你還記不記得,剛才我還提到邏輯回歸是使用決策面來決定函數的參數。怎麼理解這一點呢?先看一下我們怎麼獲得邏輯回歸的截距和回歸係數
理解邏輯回歸函數斜率slope截距interceptimport numpy as np#第1步:得到回歸方程的z值#回歸方程:z=??+??x#截距a=model.intercept_#回歸係數b=model.coef_x=3z=a+b*x#第2步:將z值帶入邏輯回歸函數中,得到概率值y_pred=1/(1+np.exp(-z))print(預測的概率值:,y_pred)print(a,b)
結果如下:
如果我們用相同的數據集,利用線性回歸方程得到的截距和回歸係數如下:
確實不一樣吧?這就是因為邏輯回歸和線性回歸的原理是不一樣的。下一次課程就會通過一個kaggle案例進一步將這兩次的內容結合起來,也是更好的掌握和複習。
最後,再貼一張回歸和分類的區別,作為結束。
推薦閱讀:
※「七步走戰略」輕鬆搞定數據分析
※坐擁百億級數據的劉濤 如何窺探數據背後的深意
※Python筆記--Pandas常用函數匯總
※機器學習/數據挖掘面試總結
※大數據的誤區,看易經呈現給人類的大智慧