膜拜!来自Kaggle金牌大佬的 Python数据发掘框架
作者头像
  • ISVE智慧显示
  • 2020-09-27 11:12:30 2

目录

  • 项目背景与分析
  • 数据读入与检查
  • 数据预处理
    • 数据校正
    • 缺失值填充
    • 数据创建
    • 数据转换
  • 探求性分析
  • 建模分析
  • 模型评价与优化
    • 交叉验证
    • 超参数调整
    • 特征选择
  • 模型验证
  • 改进与总结

项目背景与分析

泰坦尼克号沉船事件是历史上著名的灾难之一。1912年4月15日,这艘号称“永不沉没”的豪华邮轮与冰山相撞后沉没,导致1502名乘客和船员丧生。这场悲剧不仅震惊了全球,也引发了人们对海上安全的广泛关注。

在这个项目中,我们将利用泰坦尼克数据集,详细介绍如何进行数据分析、数据预处理、建立模型、特征选择、以及模型评估与优化。这份教程不仅涵盖了理论知识,还提供了丰富的实战经验,是机器学习入门者不可多得的学习资源。

数据读入与检查

首先,我们需要导入必要的库,并检查各库的版本和数据文件夹。接下来,我们将加载数据并进行初步检查。

```python

导入相关库

import sys import pandas as pd import matplotlib import numpy as np import scipy as sp import IPython import sklearn import random import time import warnings

忽略警告信息

warnings.filterwarnings('ignore')

打印各库版本

print("Python version: {}". format(sys.version)) print("pandas version: {}". format(pd.version)) print("matplotlib version: {}". format(matplotlib.version)) print("NumPy version: {}". format(np.version)) print("SciPy version: {}". format(sp.version)) print("IPython version: {}". format(IPython.version)) print("scikit-learn version: {}". format(sklearn.version))

读取数据文件

dataraw = pd.readcsv('train.csv') dataval = pd.readcsv('test.csv')

查看数据基本信息

print(dataraw.info()) print(dataraw.sample(10)) ```

数据预处理

数据校正

在数据校正阶段,我们需要检查数据是否有异常值或错误。目前看来,年龄和票价可能存在一些异常值,但这些值是合理的,因此暂时不作处理。

缺失值填充

数据集中存在一些缺失值,特别是年龄、客舱和登船位置。对于这些缺失值,我们可以通过估算来填充。具体而言,年龄将用中位数填充,客舱数据将被删除,登船位置将用众数填充。

```python

数据清洗

datacleaner = [dataraw, data_val]

for dataset in data_cleaner: dataset['Age'].fillna(dataset['Age'].median(), inplace=True) dataset['Embarked'].fillna(dataset['Embarked'].mode()[0], inplace=True) dataset['Fare'].fillna(dataset['Fare'].median(), inplace=True)

删除不需要的列

dropcolumns = ['PassengerId', 'Cabin', 'Ticket'] dataraw.drop(drop_columns, axis=1, inplace=True)

print(dataraw.isnull().sum()) print(dataval.isnull().sum()) ```

数据创建

在数据创建阶段,我们将通过特征工程创建新的特征。例如,我们可以从名字中提取头衔,从而获得性别和SES(社会经济地位)等信息。

数据转换

最后,我们将数据格式转换为适合建模的格式。具体而言,我们将分类数据转换为虚拟变量。

```python

转换分类数据

label = LabelEncoder() for dataset in datacleaner: dataset['SexCode'] = label.fittransform(dataset['Sex']) dataset['EmbarkedCode'] = label.fittransform(dataset['Embarked']) dataset['TitleCode'] = label.fittransform(dataset['Title']) dataset['AgeBinCode'] = label.fittransform(dataset['AgeBin']) dataset['FareBinCode'] = label.fit_transform(dataset['FareBin'])

定义X和Y变量

Target = ['Survived'] datax = ['Sex', 'Pclass', 'Embarked', 'Title', 'SibSp', 'Parch', 'Age', 'Fare', 'FamilySize', 'IsAlone'] dataxcalc = ['SexCode', 'Pclass', 'EmbarkedCode', 'TitleCode', 'SibSp', 'Parch', 'Age', 'Fare'] dataxy = Target + datax

创建虚拟变量

datadummy = pd.getdummies(dataraw[datax]) dataxdummy = datadummy.columns.tolist() dataxydummy = Target + datax_dummy

print('Dummy X Y: ', dataxydummy) ```

探求性分析

接下来,我们将通过描述性和图形统计来探索数据,以了解各特征与目标变量之间的关系。

```python

分析各特征与生存率的关系

for x in datax: if dataraw[x].dtype != 'float64': print('Survival Correlation by:', x) print(dataraw[[x, Target[0]]].groupby(x, asindex=False).mean()) print('-' * 10, 'n')

绘制各特征的生存率分布图

图片展示

```

建模分析

在建模阶段,我们将采用多种分类算法进行训练,并通过交叉验证和评分指标来评估模型性能。

```python

划分训练集和测试集

trainx, testx, trainy, testy = modelselection.traintestsplit(dataraw[dataxcalc], dataraw[Target], randomstate=0)

训练模型

models = [ ('LR', LogisticRegression()), ('LDA', LinearDiscriminantAnalysis()), ('KNN', KNeighborsClassifier()), ('CART', DecisionTreeClassifier()), ('NB', GaussianNB()), ('SVM', SVC()) ]

results = [] names = []

for name, model in models: kfold = modelselection.KFold(nsplits=10, randomstate=0) cvresults = modelselection.crossvalscore(model, trainx, trainy, cv=kfold, scoring='accuracy') results.append(cvresults) names.append(name) msg = "%s: %f (%f)" % (name, cvresults.mean(), cvresults.std()) print(msg) ```

模型评价与优化

交叉验证

通过交叉验证,我们可以更好地了解模型在未知数据上的表现。我们将使用交叉验证来评估模型性能。

```python

交叉验证

kfold = modelselection.KFold(nsplits=10, randomstate=0) cvresults = modelselection.crossvalscore(bestmodel, trainx, trainy, cv=kfold, scoring='accuracy') print("Cross Validation Accuracy: ", cv_results.mean()) ```

超参数调整

超参数调整是提高模型性能的重要步骤。我们将使用网格搜索和交叉验证来调整模型参数。

```python

调整超参数

param_grid = { 'C': [0.1, 1, 10, 100], 'gamma': [1, 0.1, 0.01, 0.001], 'kernel': ['rbf'] }

grid = GridSearchCV(SVC(), paramgrid, refit=True, verbose=2) grid.fit(trainx, trainy) print(grid.bestparams_) ```

特征选择

特征选择是提高模型性能的关键步骤。我们将使用递归特征消除(RFE)和交叉验证来选择最佳特征。

```python

特征选择

selector = RFE(bestmodel, nfeaturestoselect=6, step=1) selector = selector.fit(trainx, trainy) print(selector.support) print(selector.ranking) ```

模型验证

最后,我们将通过集成学习方法(如硬投票和软投票)来进一步提升模型性能。

```python

集成学习

ensemble_models = [ ('LR', LogisticRegression()), ('KNN', KNeighborsClassifier()), ('CART', DecisionTreeClassifier()), ('NB', GaussianNB()), ('SVM', SVC()) ]

ensembleresults = [] ensemblenames = []

for name, model in ensemblemodels: kfold = modelselection.KFold(nsplits=10, randomstate=0) cvresults = modelselection.crossvalscore(model, trainx, trainy, cv=kfold, scoring='accuracy') ensembleresults.append(cvresults) ensemblenames.append(name) msg = "%s: %f (%f)" % (name, cvresults.mean(), cv_results.std()) print(msg) ```

总结

通过上述步骤,我们成功构建了一个预测乘客是否生还的模型,并通过交叉验证和超参数调整优化了模型性能。尽管单一数据集上的测试结果可能与实际表现有所不同,但这些方法为我们提供了可靠的方法论指导。

建议有兴趣的读者可以进一步探索数据预处理和特征工程的方法,以提高模型的整体准确率。

    本文来源:图灵汇
责任编辑: : ISVE智慧显示
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
大佬膜拜发掘金牌框架来自数据PythonKaggle
    下一篇