google网站建设,纯英文网站建设,wordpress单页下载插件,上海还能推seo吗泰坦尼克号幸存者预测 1、特征工程概述2、数据预处理3、特征选择与提取4、建模与预测 1、特征工程概述 在上篇 泰坦尼克号幸存者数据分析 中#xff0c;我们对泰坦尼克号的幸存者做了数据分析#xff0c;通过性别、年龄、船舱等级等不同维度对幸存者进行了分类统计#xff0… 泰坦尼克号幸存者预测 1、特征工程概述2、数据预处理3、特征选择与提取4、建模与预测 1、特征工程概述 在上篇 泰坦尼克号幸存者数据分析 中我们对泰坦尼克号的幸存者做了数据分析通过性别、年龄、船舱等级等不同维度对幸存者进行了分类统计回答了哪些人可能成为幸存者
本文我们将对泰坦尼克号数据集应用特征工程、训练分类模型并对幸存者进行预测
特征工程是机器学习工作流程中重要的组成部分它是将原始数据转化成模型可理解的形式的过程。如何基于给定数据来发挥更大的数据价值就是特征工程要做的事情
在2016年的一项调查中发现数据科学家的工作中有超过80%的时间都在获取、清洗和组织数据构造机器学习流水线的时间不到20%。可见特征工程的重要性
特征工程在机器学习流程中的位置如下 特征工程处在原始数据和特征之间。它的任务就是将原始数据翻译成特征的过程这个过程将数据转换为能更好的表示业务逻辑的特征从而提高机器学习的性能
特征工程主要包括数据预处理、特征选择与提取等
2、数据预处理 对于泰坦尼克号数据集的预处理包括缺失值处理和特征编码
2.1、缺失值处理
上篇中我们查看了数据集的缺失情况
训练集Age(177)、Cabin(687)、Embarked(2)测试集Age(86)、Fare(1)、Cabin(327)
对于缺失值的处理我们一般选择填充和删除
# 年龄Age 均值填充
data[Age].fillna(data[Age].mean(), inplaceTrue)
# 船票价格Fare 均值填充
data[Fare].fillna(data[Fare].mean(), inplaceTrue)
# 座位号Cabin 缺失较多删除
data.drop(columnsCabin, inplaceTrue)
# 登船码头Embarked 众数填充
data[Embarked].fillna(data[Embarked].mode(), inplaceTrue)2.2、特征编码
数值型数据我们可以直接使用对于日期型数据我们需要转换成单独的年月日对于分类型数据需要使用特征编码转换为数值
1分类特征Sex(male/female)、Embarked(C/Q/S)
编码方案如下
# 性别Sex 男(male)1女(female)0
sex_map {male: 1, female: 0}
data[Sex] data[Sex].map(sex_map)
# 登船码头Embarked 独热编码
embarked_dum pd.get_dummies(data[Embarked], prefixEmbarked, dtypeint)
# 删除源数据中的Embarked列添加编码后的Embarked
data.drop(columnsEmbarked, axis1, inplaceTrue)
data pd.concat([data, embarked_dum], axis1)2非分类特征Fare、Age
对于非分类特征我们一般进行分箱处理
# 根据样本分位数进行分箱等比例分箱
# 船票价格(Fare) 分箱并序数编码
data[FareBand] pd.qcut(data[Fare], 4, labels[0, 1, 2, 3])
# 删除Fare特征
data.drop(columnsFare, inplaceTrue)# 年龄(Age) 分箱并序数编码
data[AgeBand] pd.cut(data[Age], bins[0, 12, 18, 60, 140], labels[0, 1, 2, 3])
# 删除Age特征
data.drop(columnsAge, inplaceTrue)3、特征选择与提取 3.1、特征提取
1头衔特征
通过观察数据我们发现乘客姓名中包含头衔例如Mrs表示已婚女性。这些头衔可以将乘客进一步细分
提取姓名中的头衔
# 提取姓名中的头衔
def extract_title(name: str):return name.split(,)[1].split(.)[0].strip()添加头衔特征
# 添加头衔特征
data[Title] data[Name].apply(extract_title)查看头衔及数量
# 查看头衔及数量
print(data[Title].value_counts().reset_index())由于头衔类别较多且部分不同写法但意思相同需要整合
# 整合意思相同的头衔
data[Title].replace([Capt, Col, Major, Dr, Rev, Jonkheer, Don, Sir, the Countess, Dona, Lady], Other, inplaceTrue)
data[Title].replace([Mme, Ms], Mrs, inplaceTrue)
data[Title].replace([Mlle], Miss, inplaceTrue)
print(data[Title].value_counts().reset_index())对头衔特征进行编码转化为数值
# 头衔特征编码序数编码
title_map {Mr: 0, Miss: 1, Mrs: 2, Master: 3, Other: 4}
data[Title] data[Title].map(title_map)# 删除Name特征
data.drop(columnsName, axis1, inplaceTrue)2家庭规模特征
通过观察数据我们发现我们可以通过乘客兄弟姐妹及配偶人数和乘客父母及子女人数计算得到本次出行的乘客家庭规模
# 家庭规模(FamilySize) 兄弟姐妹及配偶人数(SibSp) 父母及子女人数(Parch) 乘客自己(1)
data[FamilySize] data[SibSp] data[Parch] 1
# 对家庭规模特征进行分箱1人(Alone)、2-4人(Small)、4人(Large)
data[FamilySize] pd.cut(data[FamilySize], bins[1, 2, 5, 12], labels[A, S, L], rightFalse, include_lowestTrue)
# 家庭规模特征编码序数编码
fs_map {A: 0, S: 1, L: 2}
data[FamilySize] data[FamilySize].map(fs_map)
# 删除SibSp、Parch特征
data.drop(columns[SibSp, Parch], inplaceTrue)3.2、特征选择
更多的数据优于更好的算法而更好的数据优于更多的数据。删除无关特征最大程度保留数据
# 删除其他无关特征
data.drop(columns[PassengerId, Ticket], inplaceTrue)
# 应用了特征工程的数据
print(data.head().to_string())将非数值型的原始数据转化为数值型的特征这就是特征工程所做的事情
4、建模与预测 保存特征工程处理后的数据以方便进行训练和评估
# 保存特征工程处理后的数据训练集和测试集
data.to_csv(new_train.csv, indexFalse, encodingutf-8)特征工程处理后的泰坦尼克号数据集下载训练集和测试集传送门
需要注意的是测试集不包含Survived列。因此我们将对处理后的训练集重新进行训练集与测试集的划分并基于新的训练集与测试集建模和预测
# 训练集和测试集
train pd.read_csv(new_train.csv)
# X_test pd.read_csv(new_test.csv)
X_train train.iloc[:, 1:]
y_train train.iloc[:, 0]from sklearn.model_selection import train_test_split# 重新划分训练集80%和测试集20%
X_train, X_test, y_train, y_test train_test_split(X_train, y_train, test_size0.2, random_state0)下面我们使用多种分类算法进行建模和预测
4.1、逻辑回归幸存者预测
from sklearn.linear_model import LogisticRegression# 逻辑回归分类器(二分类)默认求解器lbfgs、分类方式OvR
lr LogisticRegression()
# 训练模型
lr.fit(X_train, y_train)# 预测
y_pred lr.predict(X_test)
# print(y_pred)# 准确度评分
print(lr.score(X_test, y_test)) # 0.78212290502793294.2、K近邻分类幸存者预测
from sklearn.neighbors import KNeighborsClassifier# KNN分类器默认使用标准欧几里德度量标准
knn_clf KNeighborsClassifier(n_neighbors2)
# 训练模型
knn_clf.fit(X_train, y_train)# 预测
y_pred knn_clf.predict(X_test)
# print(y_pred)# 平均准确度
print(knn_clf.score(X_test, y_test)) # 0.8156424581005587现在只要给定一个新的乘客的数据我们就能预测该乘客在此次泰坦尼克号事故中是否幸存了而且预测准确率约达80%