IT教程 ·

量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。

【自制操作系统09】中断的代码实现

用kaggle上的泰坦尼克的数据来实操。

在主页上下载了数据。
使命:运用泰坦尼克号搭客数据竖立机械进修模子,来展望搭客在海难中是不是生存。
在现实海难中,2224位搭客中有1502位遇难了。好像有的搭客比别的搭客更有时机得救。本使命的目标就是找出哪类人更轻易得救。
数据集有两个,一个是练习数据集"train.csv",另一个是测试数据集"test.csv"。
官方引荐一个教程:
先照着来吧。
就是熟习了全部效果上传流程,运用了随机树丛林算法,效果正确率是77.551%,排9444位。
接下来就是我本身折腾了。
读取数据后,用info函数看看。
print(train_data.info())
print(test_data.info())
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第1张

有三列数据有缺失值。先将数据可视化吧。
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第2张

第一张是遇难者与得救者的比例,第二张是三个票价品级的人数,第三张是遇难者及得救者的岁数散布,第四张是按船票品级的岁数散布,末了一张是三个口岸的登船人数。
再画一个差异船票品级的搭客的得救率。
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第3张

可见高品级的得救率更高。
再绘图看性别与得救的关联
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第4张

真是lady first
下面再看各个舱别的得救人数。
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第5张

高等舱的女性生还率最高,其次是高等舱男性,低等舱男性生还率最低。
再看各口岸登船的状况。
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第6张

三个口岸登船人数顺次下落,死亡率差不多。
有堂兄弟妹,有后代父母对死亡率的影响。
g = train_data.groupby(["SibSp", "Survived"])
df = pd.DataFrame(g.count()["PassengerId"])
print(df)

g = train_data.groupby(["Parch", "Survived"])
df = pd.DataFrame(g.count()["PassengerId"])
print(df)
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第7张

没看出啥来。
Cabin缺失数据太多,绘图看看数据缺失的和有数据的两组死亡率是不是有差异。
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第8张

貌似有cabin纪录的得救率高一些。
接下来就要洗濯数据了,主如果处置惩罚缺失的数据,举行数据转换。
(下面参考了https://blog.csdn.net/weixin_44451032/article/details/100103998)
先检察缺失值
print(train_data.isnull().sum())
print(test_data.isnull().sum())
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第9张

主如果Age、Embarked和Cabin三个字段的缺失数据较多。
Age用岁数中位数添补,登船所在添补为众数,Cabin则采纳因子化,即依据有没有Cabin数据分为两类。
train_data["Age"].fillna(train_data["Age"].median(), inplace = True)
test_data["Age"].fillna(test_data["Age"].median(), inplace = True)
train_data["Embarked"] = train_data["Embarked"].fillna('S')
train_data.loc[(train_data.Cabin.notnull()), "Cabin"] = 1
train_data.loc[(train_data.Cabin.isnull()), "Cabin"] = 0
test_data.loc[(test_data.Cabin.notnull()), "Cabin"] = 1
test_data.loc[(test_data.Cabin.isnull()), "Cabin"] = 0
再看看有没有缺失数据的
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第10张

行啦。
接下来把非数值数据转换为数值数据
将性别数据转换为数值数据
train_data.loc[train_data["Sex"] == "male", "Sex"] = 0
train_data.loc[train_data["Sex"] == "female", "Sex"] = 1
test_data.loc[test_data["Sex"] == "male", "Sex"] = 0
test_data.loc[test_data["Sex"] == "female", "Sex"] = 1
将登船所在数据转换为数值数据
C:0, Q:1, S:2
train_data.loc[train_data["Embarked"] == 'C', "Embarked"] = 0
train_data.loc[train_data["Embarked"] == 'Q', "Embarked"] = 1
train_data.loc[train_data["Embarked"] == 'S', "Embarked"] = 2
test_data.loc[test_data["Embarked"] == 'C', "Embarked"] = 0
test_data.loc[test_data["Embarked"] == 'Q', "Embarked"] = 1
test_data.loc[test_data["Embarked"] == 'S', "Embarked"] = 2

print(train_data.head())
print(test_data.head())
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第11张

末了,提取我们以为在展望模子中主要的特性: Pclass,Sex,Age,Embarked,SibSp,Parch,Cabin
构建一个新的数据表。
columns = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Embarked', 'Survived', 'Cabin']
new_train_data = train_data[columns]
print(new_train_data.info())
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第12张

OK,能够入手下手建模了。
先用刚学的线性回归模子。
线性回归模子
特性变量
predictors = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Embarked', 'Cabin']
LR = LinearRegression()
设置举行交织考证
kf = KFold(5, random_state = 0)
train_target = new_train_data["Survived"]
accuracys = []
for train, test in kf.split(new_train_data):
LR.fit(new_train_data.loc[train, predictors], new_train_data.loc[train, "Survived"])
pred = LR.predict(new_train_data.loc[test, predictors])
pred[pred >= 0.6] = 1
pred[pred < 0.6] = 0
accuracy = len(pred[pred == new_train_data.loc[test, "Survived"]])/len(test)
accuracys.append(accuracy)
print(np.mean(accuracys))
效果:0.799083547799887
提交kaggle今后效果并不好。
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第13张

再看看回归的详细效果。
print("回归系数:", LR.coef_)
print("截距:", LR.intercept_)
X = new_train_data[predictors]
y = new_train_data["Survived"]
Y = LR.predict(X)
print("模子评分:", LR.score(X, y))
i = 241
for index in predictors:
X = new_train_data[index]
fig = plt.subplot(i)
i += 1
plt.plot(X, Y, "*")
plt.plot(X, y, "o")
plt.savefig("LRtest.png")
效果:
回归系数: [-0.13393963 0.50834201 -0.00505791 -0.03254537 -0.03019912 -0.02651349
0.11037934]
截距: 0.7106465692231267
0.40082362319192455
模子的R²才0.4(越靠近1越抱负)。
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第14张

看着也没啥联络。再看看每一个回归系数的磨练吧。sklearn里好像没有相干函数,照样用statsmodels模块里的函数。
# 看模子的假设磨练
X = new_train_data[predictors]
X = sm.add_constant(X)
model = sm.OLS(Y, X).fit()
res = get_index(model)
print("回归参数", model.params)
print("回归效果", res)
print(model.summary())
量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第15张

量化投资学习条记19——回归剖析:实操,泰坦尼克号搭客生还机遇展望,线性回归方式。 IT教程 第16张

回归系数跟用sklearn算的一样,但磨练效果却迥殊好,有点诡异。大概是因为这个问题许多变量只要少数几个值,以至两个值,是离散变量,不适合直接用线性回归。
再尝尝别的要领。
本文代码:
今后关于这个问题的代码都放到这内里。

 

博客圆美化主题推荐之Slience

参与评论