機器學習簡易入門(四)


摘要:使用logistic回歸來預測某個人的入學申請是否會被接受

聲明:(本文的內容非原創,但經過本人翻譯和總結而來,轉載請注明出處)

本文內容來源:https://www.dataquest.io/mission/59/logistic-regression

 

原始數據展示

這是一份美國入學申請的錄取記錄表,admit – 是否錄取,1代表錄取,0代表否定;gpa – gpa成績,gre – 績點

import pandas

admissions
= pandas.read_csv('admissions.csv')

clip_image001

在之前已經介紹過了線性回歸,現在同樣使用線性回歸來進行預測

from sklearn.linear_model import LinearRegression

model
= LinearRegression()

#訓練模型

model.fit(admissions[[
'gre', 'gpa']], admissions["admit"])

admit_prediction
= model.predict(admissions[['gre', 'gpa']])

plt.xlabel(
'gpa')

plt.ylabel(
'admit_prediction')

plt.scatter(admissions[
"gpa"], admit_prediction)

plt.show()

clip_image002

在上圖中可見,有些預測結果小於0,而這明顯是不對的,因為預測結果應該只能為0或者1,我們現在需要獲取一個介於0和1之間的概率,然后通過之前的文章中介紹過的分類算法(機器學習簡易入門(二)- 分類)來確定錄取一個人的概率的閥值來決定錄取結果,最終生成只有0和1的結果

 

logistic回歸函數

logistic回歸產生的輸出都位於0和1之間,通常用來產生預測某個事件的發生概率,該函數的格式為clip_image003,其中的e是一個無理數常量,該函數有一個很漂亮的形狀

# logistic回歸函數

def logit(x):

return np.exp(x) / (1 + np.exp(x))

# 在-6到6之間等差產生50個數

t
= np.linspace(-6,6,50, dtype=float)

ylogit
= logit(t)

#作圖

plt.plot(t, ylogit, label
="logistic")

plt.ylabel(
"Probability")

plt.xlabel(
"t")

plt.title(
"Logistic Function")

plt.show()

clip_image004

logistic回歸

在線性回歸方程中clip_image005,可以將該方程產生的結果y放入到logistic回歸方程,從而將線性方程產生的結果轉換為一個概率clip_image006,對於本文來說,這個logistic回歸方程為clip_image007,現在根據這個logistic回歸方程就能產生一個錄取概率。

類似於之前使用scikit-learn庫中的線性回歸,現在也可以直接使用該庫中的logistic回歸

from sklearn.linear_model import LogisticRegression

#對數據集進行隨機重排序
admissions = admissions.loc[np.random.permutation(admissions.index)]

# 將隨機排序后的前700條數據作為訓練集,后面的作為測試集
num_train = 700
data_train
= admissions[:num_train]
data_test
= admissions[num_train:]

logistic_model
= LogisticRegression()
logistic_model.fit(data_train[[
'gpa', 'gre']], data_train['admit'])

# 進行測試
fitted_test = logistic_model.predict_proba(data_test[['gpa', 'gre']])[:, 1] #因為predict_proba返回的是一個兩列的矩陣,矩陣的每一行代表的是對一個事件的預測結果,第一列代表該事件不會發生的概率,第二列代表的是該事件會發生的概率。而這里需要的是第二列的數據
plt.scatter(data_test['gre'], fitted_test)
plt.xlabel(
'gre')
plt.ylabel(
'probability ')
plt.show()

clip_image008

評估模型

准確率

現在假設只要錄取概率大於0.5的就能錄取,計算一下這個模型的准確性

# predict()函數會自動把閥值設置為0.5

predicted
= logistic_model.predict(data_train[['gpa','gre']])

# 計算在訓練集中正確預測的准確率

accuracy_train
= (predicted == data_train['admit']).mean()

#計算在測試集中正確預測的准確率

predicted
= logistic_model.predict(data_test[['gpa','gre']])

accuracy_test
= (predicted == data_test['admit']).mean()

clip_image009

ROC曲線

分別計算訓練集和測試集的ROC曲線和AUC

from sklearn.metrics import roc_curve, roc_auc_score

train_probs
= logistic_model.predict_proba(data_train[['gpa', 'gre']])[:,1]

test_probs
= logistic_model.predict_proba(data_test[['gpa', 'gre']])[:,1]

#計算AUC

auc_train
= roc_auc_score(data_train["admit"], train_probs)

auc_test
= roc_auc_score(data_test["admit"], test_probs)

print('Auc_train: {}'.format(auc_train))

print('Auc_test: {}'.format(auc_test))

# 計算ROC曲線

roc_train
= roc_curve(data_train["admit"], train_probs)

roc_test
= roc_curve(data_test["admit"], test_probs)

# 作圖

plt.plot(roc_train[0], roc_train[
1])

plt.plot(roc_test[0], roc_test[
1])

clip_image010


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com