1 导入数据并查看数据
1.1 数据集的拼接
数据导入后通过append拼接训练集和测试集,便于特征提取时同时处理训练集和测试集
full = train.append(test,sort=False,ignore_index=True)
- 设置参数sort=False保证拼接后数据列为原始顺序,如果不设置则列按照字母排序。
- 设置 ingore_index=True 表示重生成index,避免index重复
full2 = pd.concat([train,test],sort=False,ignore_index=True)
得到相同的结果。
1.2 查看数据集基本信息
full.describe()
获取数据集中的数值类别的统计信息,包括数量、平均值、标准差、最小值,升序25%的值,百分之50的值,百分之75的值和最大值。
full.info()
统计数据数量,数据类别,所占存储空间。通过该统计信息能够发现哪列由缺失值。便于下一步进行数据清洗。
2 数据清洗
数据清洗三种方法:
- 如果是数值类型,用平均值取代
- 如果是分类数据,用最常见的类别取代
- 使用模型预测缺失值
# 用平均值取代年龄的缺失值
full['Age'] = full['Age'].fillna(full['Age'].mean())
列数据通过列名‘Age’直接取值,fillna方法用于缺失值的填充,.mean()方法取得平均值。
# 字符串缺失值的处理,Embarked缺两条,Cabin缺1014条
full['Embarked'].value_counts()
value_counts()方法统计类别频次,下一步将用出现最多的类别代替缺失值
full['Embarked'] = full['Embarked'].fillna('S')
# 缺失值比较多,Canbin缺失值填充为U,表示未知(Uknow)
full['Cabin'] = full['Cabin'].fillna('U')
如果缺失值太多,则用一个新的类别代替缺失值。
3 特征提取
数据类型分析:
(1)数值类型
(2)时间序列
(3)分类数据
a)有直接类别的
b)字符串类型
3.1 有直接类别且只有两类的分类数据
# 将性别值映射为数值,男(male)为1,女(female)为0
sex_mapDict = {'male':1,'female':0}
full['Sex']=full['Sex'].map(sex_mapDict) # 通过map方法,接收字典参数进行映射
full.head()
有直接类别的数据类型,通过字典利用map方法直接映射
3.2 有直接类别且多余两类的数据
# 将 Embarked 映射为one-hot形式
embarkedDf = pd.DataFrame()
# 使用get_dummies进行one-hot编码,产生虚拟变量(dummy variables),列名前缀为Embarked
embarkedDf = pd.get_dummies(full['Embarked'], prefix='Embarked')
embarkedDf.head()
pd.get_dummies()方法传入单列字符串数据,生成多列one-hot数据类型
full = pd.concat([full,embarkedDf], axis=1)
full.drop('Embarked', axis=1,inplace=True)
full.head()
生成的多列one-hot数据,与原数据进行拼接,然后删除原始列。
3.3 根据行业知识对原始字符串进行处理,映射,然后转化为one-hot
3.3.1 获取字符串的某一部分
# 从姓名中获取头衔
# Braund,Mr.Pwen Harris 逗号前面时'名',逗号后面时'头衔.姓'
def getTitle(name):
str1 = name.split(',')[1] # Mr. Owen Harris
str2 = str1.split('.')[0] # Mr
# strip方法移除字符串头尾指定的字符
str3 = str2.strip()
return str3
titleDf = pd.DataFrame()
titleDf['Title'] = full['Name'].map(getTitle)
titleDf.iloc[30:40]
利用map和lambda函数获取一列数据的首字母
cabinDf = pd.DataFrame()
full['Cabin'] = full['Cabin'].map(lambda c:c[0])
3.3.2 定义映射关系
# 定义头衔映射关系?
title_mapDict = {
"Capt": "Officer",
"Col": "Officer",
"Major": "Officer",
"Jonkheer": "Royalty",
"Don": "Royalty",
"Sir" : "Royalty",
"Dr": "Officer",
"Rev": "Officer",
"the Countess":"Royalty",
"Dona": "Royalty",
"Mme": "Mrs",
"Mlle": "Miss",
"Ms": "Mrs",
"Mr" : "Mr",
"Mrs" : "Mrs",
"Miss" : "Miss",
"Master" : "Master",
"Lady" : "Royalty"
}
# 通过map函数,对Series每个数据使用定义的字典进行映射
titleDf['Title'] = titleDf['Title'].map(title_mapDict)
3.3.3 使用pd.get_dummies进行one-hot编码
titleDf = pd.get_dummies(titleDf['Title'])
full = pd.concat([full,titleDf], axis=1)
full.drop('Name',axis=1,inplace=True)
3.3.4 构造特征
# 家庭信息特征提取
familyDf = pd.DataFrame()
familyDf['FamilySize'] = full['Parch'] + full['SibSp'] + 1
# 人数=1 小家庭,2<=人数<=4 中等家庭,人数 > 5 大家庭
familyDf['Family_Single'] = familyDf['FamilySize'].map(lambda s:1 if s==1 else 0)
familyDf['Family_small'] = familyDf['FamilySize'].map(lambda s:1 if 2<=s<=4 else 0)
familyDf['Family_Large'] = familyDf['FamilySize'].map(lambda s:1 if s>=5 else 0)
familyDf.head()
4 特征选择
# 计算各个特征的相关系数
corrDf = full.corr()
corrDf
full.corr()计算各个特征的相关系数
# 查看各个特征与生存情况(Survived)的相关系数
corrDf['Survived'].sort_values(ascending=False)
通过sort_values进行排序
选择特征,使用pd.concat()方法进行合并
# 根据各个特征与生存情况的相关系数大小,选择几个特征作为模型的输入
# 头衔(titleDf),客仓等级(篇classDf),家庭大小(familyDf),船票价格(Fare),船舱号(cabinDf),登船港口(embaredDF),性别(Sex)
full_X = pd.concat([titleDf,
PlclassDf,
familyDf,
full['Fare'],#船票价格
cabinDf, # 船舱号
embarkedDf, # 登船港口
full['Sex'], # 性别
],axis=1)
full_X.head()
5 构建模型
5.1 从特征数据中选取训练集数据
- 训练集特征
# 原始数据集有891行
sourceRow = 891
# 原始数据:特征
source_X = full_X.loc[0:sourceRow-1,:]
- 训练集标签
# 原始数据:标签
source_y = full.loc[0:sourceRow-1,'Survived']
source_y
- 预测集特征
# 预测数据集:特征
pred_X = full_X.loc[sourceRow:,:]
- 进一步把训练集分为训练集和测试集
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y = train_test_split(source_X, source_y,train_size=0.8)
5.2 选择机器学习算法计算的到结果
# 第一步: 选择一个机器学习算法,用于模型的训练
from sklearn.linear_model import LogisticRegression
# 第二步:创建模型:逻辑回归
model = LogisticRegression()
# 第三步: 训练模型
model.fit(train_X, train_y)
# 第四步:分类问题,score得到的是模型的正确率
model.score(test_X, test_y)
# 第五步:在预测集上计算得到的结果
pred_Y = model.predict(pred_X)
# 第六步:结果导出
pred_Y = pred_Y.astype(int)
passenger_id = full.loc[sourceRow:,'PassengerId']
predDf = pd.DataFrame({'PassengerId':passenger_id,
'Survived':pred_Y})
predDf.to_csv('titanic_pred.csv', index=False)