Kaggle 是一个用来学习、分享和竞赛的线上数据实验平台,有点相似 KDD—CUP(国际知识发现和数据挖掘竞赛),企业或者研究者能够将背景、数据、指望指标等发布在 kaggle 上,用竞赛的方式向全世界的数据科学家和爱好者寻求解决方案。热爱数(dong)据(shou)挖(zhe)掘(teng)的小伙伴们能够下载/分析数据,使用统计/机器学习/数据挖掘等方面的知识,创建算法模型,得出结果并提交,排名靠前可能还会有奖励哦!前端
www.kaggle.com/c/titanicpython
在 Data 下咱们会看到官方给的 train.csv 和 test.csv 两个文件,分别是训练和测试数据。咱们可使用 virtualenv 来建立一个“隔离”的 python 应用环境(虚拟环境)。在这里,你不须要考虑系统原有库的版本,只须要 pip 来管理你须要用到的一切。算法
import pandas as pd
import numpy as np
from pandas import Series,DataFrame
data_train = pd.read_csv("./train.csv")
pd.DataFrame(data_train)
复制代码
pandas 是经常使用的 python 数据处理包,把 csv 文件读入成 dataframe 格式,在 jupyter notebook 中,能够看到咱们的数据长什么样: 微信
咱们就能够把它看做一张 excel 表格,共有 12 列,891 行(表明在 train_csv 中共有 891 个乘客)。Survived 字段表明该乘客是否获救(1 表明获救,0 表明没有获救),其他是一些我的信息dom
data_train.info()
复制代码
data_train.describe()
复制代码
每一个乘客大概有 12 种属性提供给咱们,仅仅对于上面两行操做对于数据的了解还没法为咱们提供想法和思路,咱们如今不知道哪些有用哪些对于模型没有用,因此到了最关键的特征工程环节。咱们知道最终的 output 是 Suvived,如今须要寻找最后的 Survived 与各个属性之间有着什么样的内在关系。从大副的口中已经得知「要首先考虑妇女和儿童」。机器学习
for x in data1_x:
if data1[x].dtype != 'float64' :
print('Survival Correlation by:', x)
print(data1[[x, Target[0]]].groupby(x, as_index=False).mean())
print('-'*10, '\n')
print(pd.crosstab(data1['Title'],data1[Target[0]]))
复制代码
fig = plt.figure()
fig.set(alpha=0.2)
Survived_0 = data_train.Pclass[data_train.Survived == 0].value_counts()
Survived_1 = data_train.Pclass[data_train.Survived == 1].value_counts()
df=pd.DataFrame({'Survived':Survived_1, 'unSurvived':Survived_0})
df.plot(kind='bar', stacked=True)
plt.title("Survived status of all passenger classes")
plt.xlabel("passanger's level")
plt.ylabel("number")
plt.show()
复制代码
data_train.Age[data_train.Pclass == 1].plot(kind='kde')
data_train.Age[data_train.Pclass == 2].plot(kind='kde')
data_train.Age[data_train.Pclass == 3].plot(kind='kde')
plt.xlabel("age")# plots an axis lable
plt.ylabel("dendity")
plt.title("Age distribution of passengers levels")
plt.legend(('first level', 'second level','third level'),loc='best')
复制代码
咱们对大致数据已经看过一遍了,对于感兴趣的属性也有了大概的了解。如今咱们须要 简单处理一下这些数据,为机器学习建模作点准备了。先从最突出的数据属性开始吧,Cabin 和 Age,由于这两项有些乘客的信息不包含它们,有丢失的数据对于下一步的工做影响太大。性能
先说 Cabin,暂时咱们就按照刚才说的,按 Cabin 有无数据,将这个属性处理成 Yes 和 No 两种类型吧。学习
再说 Age:测试
一般遇到缺值的状况,咱们会有几种常见的处理方式优化
本例中,由于 Cabin 不是影响最终结果的特征之一。因此直接考虑别的须要用到的特征(性别,等级,等级),并将其中的类目型转化为数值型特征,咱们可使用 pandas 的“get_dummies”来完成这个工做,并接在原来的“data_train”上
dummies_Embarked = pd.get_dummies(data_train['Embarked'], prefix= 'Embarked')
dummies_Sex = pd.get_dummies(data_train['Sex'], prefix= 'Sex')
dummies_Pclass = pd.get_dummies(data_train['Pclass'], prefix= 'Pclass')
df = pd.concat([data_train, dummies_Embarked, dummies_Sex, dummies_Pclass], axis=1)
df.drop(['Pclass', 'Name', 'Sex', 'Ticket', 'Embarked'], axis=1, inplace=True)
df
复制代码
import sklearn.preprocessing as preprocessing
scaler = preprocessing.StandardScaler()
age_scale_param = scaler.fit(df['Age'])
df['Age_scaled'] = scaler.fit_transform(df['Age'], age_scale_param)
fare_scale_param = scaler.fit(df['Fare'])
df['Fare_scaled'] = scaler.fit_transform(df['Fare'], fare_scale_param)
df
复制代码
嗯,这样初级的数据处理就完成的差很少了
我么把须要的 feature 字段提取出来,转成 numpy 格式,使用 scikit-learn 中的 LogisticRegression 建模。
from sklearn import linear_model
# 用正则取出咱们要的属性值
train_df = df.filter(regex='Survived|Age_.*|SibSp|Parch|Fare_.*|Cabin_.*|Embarked_.*|Sex_.*|Pclass_.*')
train_np = train_df.as_matrix()
# y 即 Survival 结果
y = train_np[:, 0]
# X 即特征属性值
X = train_np[:, 1:]
# fit 到 RandomForestRegressor 之中
clf = linear_model.LogisticRegression(C=1.0, penalty='l1', tol=1e-6)
clf.fit(X, y)
clf
复制代码
OK!!!经过这样建模后,咱们获得一个 model,而后再把 test.csv 经过一样的数据简单处理后,就能够获得预测结果了。
等等,你觉得这样就完了么。这其实只完成了刚刚开始的一步,咱们只是作了一个 baseline model,一切都仍是基础的,咱们还须要优化。
不过在如今的场景下,先不着急作这个事情,咱们这个 baseline 系统还有些粗糙,先再挖掘挖掘。
文 / joeCDC
数学爱好者
编 / 荧声
本文已由做者受权发布,版权属于创宇前端。欢迎注明出处转载本文。本文连接:knownsec-fed.com/2018-12-04-…
想要订阅更多来自知道创宇开发一线的分享,请搜索关注咱们的微信公众号:创宇前端(KnownsecFED)。欢迎留言讨论,咱们会尽量回复。
感谢您的阅读。