1.邏輯回歸
1.1簡單邏輯回歸模型實例——二分類
1.1.1問題描述
利用Python中sklearn包進行邏輯回歸分析。根據已有數據探究“學習時長”與“是否通過考試”之間關系,並建立預測模型。
1.2代碼及其解釋
1.2.1生成/導入數據
# 1.導入包
import warnings
import pandas as pd
import numpy as np
from collections import OrderedDict
import matplotlib.pyplot as plt
warnings.filterwarnings('ignore')
# 2.創建數據(學習時間與是否通過考試)
dataDict={'學習時間':list(np.arange(0.50,5.50,0.25)),
'考試成績':[0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
dataOrDict=OrderedDict(dataDict)
dataDf=pd.DataFrame(dataOrDict)
1.2.2查看數據
# 查看數據具體形式
dataDf.head()
# 查看數據類型及缺失情況
dataDf.info()
# 查看描述性統計信息
dataDf.describe()
1.2.3繪制散點圖查看數據分布情況
# 提取特征和標簽
exam_X = dataDf['學習時間']
exam_y = dataDf['考試成績']
# 繪制散點圖
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.scatter(exam_X, exam_y, color='b', label='考試數據')
plt.legend(loc=2)
plt.xlabel('學習時間')
plt.ylabel('考試成績')
plt.show()
從圖中可以看出當學習時間高於某一閾值時,一般都能夠通過考試,因此我們利用邏輯回歸方法建立模型。
1.2.4構建模型
(1)拆分訓練集並利用散點圖觀察
# 1.拆分訓練集和測試集
from sklearn.model_selection import train_test_split
exam_X = exam_X.values.reshape(-1, 1)
exam_y = exam_y.values.reshape(-1, 1)
train_X, test_X, train_y, test_y = train_test_split(exam_X, exam_y, train_size=0.8)
print('訓練集數據大小為', train_X.size, train_y.size)
print('測試集數據大小為', test_X.size, test_y.size)
# 2.散點圖觀察
plt.scatter(train_X, train_y, color='b', label='考試數據')
plt.scatter(test_X, test_y, color='r', label='測試數據')
plt.legend(loc=2)
plt.xlabel('學習時間')
plt.ylabel('考試成績')
plt.show()
(2)導入模型
# 3.導入模型
from sklearn.linear_model import LogisticRegression
modelLR = LogisticRegression()
(3)訓練模型
# 4.訓練模型
modelLR.fit(train_X,train_y)
1.2.4模型評估
1、模型評分(即准確率)
modelLR.score(test_X,test_y)
>>>
0.75
2、指定某個點的預測情況
# 學習時間確定時,預測為0和1的概率分別為多少?
modelLR.predict_proba([[3]])
>>>
array([[0.53351574, 0.46648426]])
# 學習時間確定時,預測能否通過考試?
modelLR.predict([[3]])
>>>
array([0], dtype=int64)
3、求出邏輯回歸函數並繪制曲線
邏輯回歸函數
# 先求出回歸函數y=a+bx,再代入邏輯函數中pred_y=1/(1+np.exp(-y))
b=modelLR.coef_
a=modelLR.intercept_
print('該模型對應的回歸函數為:1/(1+exp-(%f+%f*x))'%(a,b))
>>>
該模型對應的回歸函數為:1/(1+exp-(-4.891204+1.585647*x))
邏輯回歸曲線
# 畫出相應的邏輯回歸曲線
plt.scatter(train_X,train_y,color='b',label='考試數據')
plt.scatter(test_X,test_y,color='r',label='測試數據')
plt.plot(test_X,1/(1+np.exp(-(a+b*test_X))),color='r')
plt.plot(exam_X,1/(1+np.exp(-(a+b*exam_X))),color='y')
plt.legend(loc=2)
plt.xlabel('學習時間')
plt.ylabel('考試成績')plt.show()
1.3實驗結果
1.3.1預測訓練數據
# 預測訓練數據
modelLR.predict(exam_X)
>>>
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1],
dtype=int64)
# 由預測結果可知學習時間大於3時,預測能否通過考試
1.3.2計算各種指標
from sklearn.metrics import accuracy_score, precision_score, recall_score
y_true = dataDf['考試成績']
y_pred = modelLR.predict(exam_X)
# 准確率
accuracy_score(y_true, y_pred)
>>>
0.95
# 精確度
precision_score(y_true, y_pred)
>>>
1.0
# 召回率
recall_score(y_true, y_pred)
>>>
0.9