量化投資學習筆記20——迴歸分析:實操,泰坦尼克號乘客生還機會預測,邏輯迴歸方法。

這次嘗試用邏輯迴歸來解決泰坦尼克號的問題。本文參考了https://zhuanlan.zhihu.com/p/28408516 和 https://www.cnblogs.com/BYRans/p/4713624.html
邏輯迴歸(Logistic Regression)是一種用於解決二分類(0 or 1)問題的機器學習方法,用於估計某種事物的可能性。二分類問題是指預測的y值只有兩個取值的問題。
邏輯迴歸和線性迴歸都屬於廣義上的線性模型。邏輯迴歸假設因變量y服從伯努利分佈,線性迴歸假設因變量y服從高斯分佈。
邏輯迴歸通過Sigmoid函數引入了非線性因素。

用python畫一下函數圖像吧。

邏輯迴歸本質上是線性迴歸,只是在特徵到結果的映射中增加了一層函數映射。邏輯迴歸的表達式:

函數h的意思是在給定的x和θ的條件下g = 1的概率。決策邊界,也稱爲決策面,是用於在N維空間,將不同類別樣本分開的平面或曲面。
決策邊界其實就是一個方程,在邏輯迴歸中,決策邊界由xθ**t = 0定義。(也就是,在該平面或曲面一側的樣本在邏輯迴歸中被歸爲一類,另一側被歸爲另一類。
下面開始幹活吧,參考了 https://blog.csdn.net/zpxcod007/article/details/79966273
先增加一個Family字段,根據SibSp與Parch之和分類。如果船上沒有親屬,值爲0,有1-3位親屬,值爲1,有4位或以上親屬,值爲3

 train_data["Family"] = train_data["SibSp"] + train_data["Parch"]
 train_data.loc[(train_data.Family == 0), "Family"] = 0
 train_data.loc[((train_data.Family > 0) & (train_data.Family < 4)), "Family"] = 1
 train_data.loc[(train_data.Family >= 4), "Family"] = 2
 test_data["Family"] = test_data["SibSp"] + test_data["Parch"]
 test_data.loc[(test_data.Family == 0), "Family"] = 0
 test_data.loc[((test_data.Family > 0) & (test_data.Family < 4)), "Family"] = 1
 test_data.loc[(test_data.Family >= 4), "Family"] = 2

然後進行建模分析

from sklearn.linear_model import LogisticRegression as LR
from sklearn.model_selection import KFold, cross_val_score

kf = KFold(5, random_state = 0)
 predictors = ['Pclass', 'Sex', 'Age', 'Family', 'Embarked', 'Cabin']
 lr = LR(C = 0.1, solver = "liblinear", penalty = "l2")
 lr.fit(train_data[predictors], train_data["Survived"])
 print(cross_val_score(lr, train_data[predictors], train_data["Survived"], cv = kf).mean())
 accuracys = []
 testLR = LR(C = 0.1, solver = "liblinear", penalty = "l2")
 for train, test in kf.split(train_data):
  testLR.fit(train_data.loc[train, predictors], train_data.loc[train, "Survived"])
  pred = testLR.predict_proba(train_data.loc[test, predictors])
  # print(pred.shape)
  new_pred = pred[:, 1]
  new_pred[new_pred >= 0.5] = 1
  new_pred[new_pred < 0.5] = 0
  accuracy = len(new_pred[new_pred == train_data.loc[test, "Survived"]])/len(test)
  accuracys.append(accuracy)
 print(np.mean(accuracys))

結果
0.8069549934090766
0.8069549934090766
測試的準確率達80%。輸出提交到kaggle上看看。

跟線性迴歸一樣……學其它方法吧。
畫個圖看看

再查一下model_selection的KFold函數,sklearn.model_selection.KFold(n_splits=3, shuffle=False, random_state=None)
其是做K折交叉驗證,將訓練/測試數據集劃分n_splits個互斥子集,每次用其中一個子集當作驗證集,剩下的n_splits-1個作爲訓練集,進行n_splits次訓練和測試,得到n_splits個結果。
然後用split(X, y=None, groups=None):將數據集劃分成訓練集和測試集,返回索引生成器。
本文代碼: https://github.com/zwdnet/MyQuant/blob/master/titanic/submit03.py!

我發文章的四個地方,歡迎大家在朋友圈等地方分享,歡迎點“在看”。
我的個人博客地址:https://zwdnet.github.io
我的知乎文章地址: https://www.zhihu.com/people/zhao-you-min/posts
我的博客園博客地址: https://www.cnblogs.com/zwdnet/
我的微信個人訂閱號:趙瑜敏的口腔醫學學習園地

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章