上一篇講述了機器學習基礎監督學習中的線性迴歸模型,如果沒看的朋友可以回顧一下:
本篇接著上一篇繼續講述監督學習中的邏輯迴歸,線性模型除了用於迴歸,也可以用於分類。最常用的的就是邏輯迴歸(Logistic Regression),分類的意義指的就是根據數據集的特點劃分為特定的幾類,輸出為有限的離散值。
如上如,邏輯迴歸的任務就是在數據集中將藍色和紅色的數據分開,找出一條直線或曲線,將這兩個點分開。使得這兩類數據將盡可能通過直線或曲線分為兩類,那麼對於這樣的問題怎麼求出擬合分類的之曲線的表達式呢?這裡就不能簡單地像線性迴歸一樣是一個直線方程,而我們期望的輸出結果最好只有兩種結果,是或否,那麼用數學來表示及時0或1,可用以下數學表達式表示:
其中:
為劃分邊界。最理想的就是這樣做數據的區分,但是因為該函數是不連續的,當x=0時會發生階躍,為了得到一個連續的優化方案,通常可以採用sigmoid函數:
該函數的曲線如下圖所示:
Sigmoid函數將輸出數據壓縮在(0-1)之間,這也是概率的取值範圍,因此既可以將分類問題轉化為概率問題,將函數:
代入可得邏輯迴歸的預測函數:
那麼對於二分類問題,我們可以預測y=1和y=0的概率表示為:
邏輯迴歸算法特點:
優點:計算代價不高,易於理解和實現;
缺點:模型容易欠擬合,分類的精度可能不高。
下面通過一個實例代碼案例,以便加深學習效果:
該例子原型是關於學習時間與考試是否通過的一個模型預測,其實考試通過不通過自己心裡最清楚了!其中0表示考試不通過,1表示考試通過。
<code>import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from collections import OrderedDict
import matplotlib.pyplot as plt
import numpy as np
#建立數據集
examDict={'Learning Time':[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.5,4.00,4.25,4.50,4.75,5.00,5.50,6.00,6.25],
'Result':[0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,0]}
examOrderDict=OrderedDict(examDict)
examDf=pd.DataFrame(examOrderDict)
exam_X=examDf.loc[:,'Learning Time']
print(len(exam_X))
#print(exam_y)
#建立訓練數據和測試數據
X_train,X_test,y_train,y_test=train_test_split(exam_X,exam_y,test_size=.4)
#創建邏輯迴歸模型
model=LogisticRegression(solver='liblinear')
#訓練模型
X_train=X_train.values.reshape(-1,1)
#print(X_train)
X_test=X_test.values.reshape(-1,1)
model.fit(X_train,y_train)
print(model.predict_proba([[10]]))
a1 = []
for i in range(len(exam_X)):
# print(exam_X[i])
a1.append(exam_X[i])
#獲取標籤
exam_y=examDf.loc[:,'Result']
b1 = []
for j in range(len(exam_y)):
b1.append(exam_y[j])
fig = plt.figure()
ax = fig.add_subplot()
ax.scatter(a1,b1,s=30,c="red",marker="s")
plt.xlabel("Learning Time")
plt.ylabel("result")
plt.show()/<code>
代碼中輸入學習小時數為10,預測結果不通過的概率為:2.97%,通過考試的概率為:97.02%。所以大部分人還是得投入時間學習呀!
閱讀更多 科創小新 的文章