1)目标
任务网址:kaggle_泰坦尼克号
1912年4月15日,在她的处女航中,被广泛认为的泰坦尼克号与冰山相撞后沉没。不幸的是,船上没有足够的救生艇供所有人使用,导致2224名乘客和机组人员中的1502人死亡。
尽管幸存者有一些运气,但似乎有些人比其他人更有可能生存。
在这一挑战中,我们要求您建立一个预测模型来回答以下问题:“什么样的人更有可能生存?” 使用旅客数据(即姓名,年龄,性别,社会经济舱等)。
2)流程思路
1.数据分析与处理(非常重要)
2.建立简单模型
3.训练并评估
4.修改模型
5.做出预测
3)pandas语法
读取数据:r’为告诉系统下面的引号无转义字符
data_train = pd.read_csv(r’D:\python\kaggle\泰坦尼克\数据集\titanic\train.csv’,engine = ‘python’,encoding=‘UTF-8’)
数据数量等信息:
data_train.info()
描述数据特征:
data_train.describe()
离散特征 转化为独热向量:
data_test=pd.get_dummies(data_test)
a列 大于2的数字对应的b列改为newdata:
df.loc[df.a>=2,‘b’] = ‘new_data’
调用某列的方式:
data_train[‘Age’]
data_train.Age
data_train.loc[3,5] #第三行第五列的数据:如果表头是字符串,则需要用字符串
求某列平均数:
age_mean = data_train[‘Age’].mean()
转化为数值型:(numpy)
train_np = data_train.values
删除:
del data_test[‘Name’]
找到空的:
pd.isnull(data_test.Age)
输出:
result = pd.DataFrame({‘PassengerId’:id, ‘Survived’:ans.astype(np.int32)})
result.to_csv(r"D:\python\kaggle\泰坦尼克\数据集\titanic\ans.csv", index=False)
更换数据:
data = data.replace(to_replace=’?’, value=np.nan)
4)数据认知与处理
head()头文件:
总共有12组feature,Survived为y值,表示的是该乘客是否获救;
其余都是乘客feature,包括:
PassengerId ID
Pclass 舱位
Name 姓名
Sex 性别
Age 年龄
SibSp 兄弟个数
Parch 父母与小孩个数
Ticket 船票
Fare 票价
Cabin 客舱
Embarked 港口
info()信息:
<class ‘pandas.core.frame.DataFrame’>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId 891 non-null int64
Survived 891 non-null int64
Pclass 891 non-null int64
Name 891 non-null object
Sex 891 non-null object
Age 714 non-null float64
SibSp 891 non-null int64
Parch 891 non-null int64
Ticket 891 non-null object
Fare 891 non-null float64
Cabin 204 non-null object
Embarked 889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
观察可以发现,部分数据缺失,需要补全,这里采用了比较粗暴的方式,AGE的缺失采用了平均数补全,CABIN的缺失选择了直接删掉 。
其他数据处理:归一化,删除名字等与存活率显然无关属性
5)建模与预测代码
import numpy as np
import matplotlib as plt
import pandas as pd
from sklearn import linear_model
from sklearn.ensemble import RandomForestClassifier
#读取数据
data_train = pd.read_csv(r'D:\python\kaggle\泰坦尼克\数据集\titanic\train.csv',engine = 'python',encoding='UTF-8')
#data_train.info()
data_test = pd.read_csv(r'D:\python\kaggle\泰坦尼克\数据集\titanic\test.csv',engine = 'python',encoding='UTF-8')
id = data_test.PassengerId
#数据工程
#补全AGE
age_mean = data_train['Age'].mean()
data_train.loc[pd.isnull(data_train.Age),'Age'] = age_mean
#删除无用数据NameTicket
del data_train['Name']
del data_train['Ticket']
del data_train['Cabin']
#独热向量
data_train=pd.get_dummies(data_train)
#转化为数值型
train_np = data_train.values
y = train_np[:, 1]
x = train_np[:, 2:]
#训练
lr = linear_model.LogisticRegression(solver='liblinear',C=55555, penalty='l2', tol=1e-15)
lr.fit(x, y)
#测试集处理
del data_test['Name']
del data_test['Ticket']
del data_test['Cabin']
del data_test['PassengerId']
age_mean_test = data_test['Age'].mean()
data_test.loc[pd.isnull(data_test.Age),'Age'] = age_mean_test
age_fare_test = data_test['Fare'].mean()
data_test.loc[pd.isnull(data_test.Fare),'Fare'] = age_fare_test
data_test=pd.get_dummies(data_test)
#预测
test_np = data_test.values
ans = lr.predict(test_np)
w = lr.coef_ #看一下学习到的w
result = pd.DataFrame({'PassengerId':id, 'Survived':ans.astype(np.int32)})
result.to_csv(r"D:\python\kaggle\泰坦尼克\数据集\titanic\ans.csv", index=False)
6)运行结果
7)总结
AGE的缺失采用了平均数补全,后采采用RF补全,预测性能并没有提升,可以推测,这部分数据缺失并不关键),CABIN的缺失选择了直接删掉 ,后来证明CABIN的删除影响了预测准确率,应该予以保留。
同时可能可以考虑名字字段等因素对结果的影响,另外根据结果可推测,算法处于欠拟合状态,可尝试增加特征增加其你和能力,例:增加年龄与性别的符合特征等。
8)参考
https://www.heywhale.com/mw/project/5bfe39b3954d6e0010681cd1