摘要:使用logistic迴歸來預測某我的的入學申請是否會被接受html
聲明:(本文的內容非原創,但通過本人翻譯和總結而來,轉載請註明出處)git
本文內容來源:https://www.dataquest.io/mission/59/logistic-regression算法
原始數據展現dom
這是一份美國入學申請的錄取記錄表,admit – 是否錄取,1表明錄取,0表明否認;gpa – gpa成績,gre – 績點機器學習
import pandas admissions = pandas.read_csv('admissions.csv')
在以前已經介紹過了線性迴歸,如今一樣使用線性迴歸來進行預測函數
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()
在上圖中可見,有些預測結果小於0,而這明顯是不對的,由於預測結果應該只能爲0或者1,咱們如今須要獲取一個介於0和1之間的機率,而後經過以前的文章中介紹過的分類算法(機器學習簡易入門(二)- 分類)來肯定錄取一我的的機率的閥值來決定錄取結果,最終生成只有0和1的結果學習
logistic迴歸函數測試
logistic迴歸產生的輸出都位於0和1之間,一般用來產生預測某個事件的發生機率,該函數的格式爲,其中的e是一個無理數常量,該函數有一個很漂亮的形狀spa
# 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()
logistic迴歸翻譯
在線性迴歸方程中,能夠將該方程產生的結果y放入到logistic迴歸方程,從而將線性方程產生的結果轉換爲一個機率,對於本文來講,這個logistic迴歸方程爲,如今根據這個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()
評估模型
準確率
如今假設只要錄取機率大於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()
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])