泰坦尼克号遇难预测-朴素贝叶斯分类

题目来源https://www.kaggle.com/c/titanic,

train.csv和test.csv分别为训练集和测试集(生还未知),建模之前必须进行必要的数据分析,比如将一些无关的列剔除掉,在这里只是简单的考量,实际工程中可能还要考虑数据的分布情况,比如均值、方差、每种属性下的存还比率等,并且将训练中的缺失记录剔除掉,利用平均值补齐测试集缺失值(也可以用预测的方法因为缺失不是很多),最终与官网提供的参考相比正确率已达到96.4%,结果存入submission.csv,当然还可以用其他方法进行分类,决策树、神经网络、SVM等,由于train全部用来训练,没有验证集,故没做交叉验证。

一般做题步骤:

1.通读变量,了解大致情况

2.对数据有一个宏观,如用datatrain['Age'].describe(),简单查看数据是否有误

3.关联分析,观察哪些变量会和预测目标关系比较大,哪些变量之间会有较强的关联

numeric_features = datatrain.select_dtypes(include=[np.number])#提取数值型列

corr = numeric_features.corr()#相关性分析

print (corr['survived'].sort_values(ascending=False)[:5], '\n')#提取前五正相关变量

print (corr['survived'].sort_values(ascending=False)[-5:])#提取前五负相关变量

4.查看缺失值,当缺失较多的列可删除,其他可用数据0或平均值等填补

datatrain.isnull().sum()

5.去除极端值数据

datatrain= datatrain[datatrain['Age'] < 130]

6.某些模型需要把数据变量转化为正态分布

7.构造特征:

数值变类别、类别变顺序数值、多类别简化类别(多个归为一类)、利用多类别进行多项式\简单算法运算、利用get_dummies将类别变量转换成新增的虚拟变量/指示变量(0、1)

    上述的特征处理步骤因题而已,参考http://wemedia.ifeng.com/16578677/wemedia.shtml

其中train数据(.csv逗号分隔符文件建议用notepad++打开,此处是excel打开)

test数据

 
# -*- coding:utf-8 -*-

# 导入后续需要用到的库文件
import numpy as np
import pandas as pd
import matplotlib.pylab as plt
from sklearn.preprocessing import StandardScaler
from sklearn.naive_bayes import BernoulliNB  # 伯努利模型

# 读取数据并查看,第一步
datatrain = pd.read_csv("train.csv")
data_test = pd.read_csv("test.csv")
# print(datatrain.shape)  # 892,12
# print(datatrain.isnull().sum())  #发现age(177)、carbin(687)、embarked(2)有缺失

# 选取数据集特征,去掉几种无用特征
datatrain = datatrain.drop(labels=['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
print(datatrain.head())

# 去除缺失值
datatrain = datatrain.dropna()

# 属性转化为数值型
datatrain_dummy = pd.get_dummies(datatrain[['Sex', 'Embarked']])

# 编码后和数据拼接
datatrain_conti = pd.DataFrame(datatrain, columns=['Survived', 'Pclass', 'Age', 'SibSp', 'Parch', 'Fare'], index=datatrain.index)
datatrain = datatrain_conti.join(datatrain_dummy)

X_train = datatrain.iloc[:, 1:]
y_train = datatrain.iloc[:, 0]

# 对test文件进行同样处理,去掉几种无用特征
datatest = data_test.drop(labels=['PassengerId', 'Name', 'Ticket', 'Cabin'], axis=1)
# print(datatest.head())
# print(datatest.isnull().sum())  # age、Fare有缺失

datatest = datatest.fillna(datatest.mean()['Age':'Fare'])  # 填补缺失值
print(datatest.isnull().sum())

datatest_dummy = pd.get_dummies(datatest[['Sex', 'Embarked']])

datatest_conti = pd.DataFrame(datatest, columns=['Pclass', 'Age', 'SibSp', 'Parch', 'Fare'], index=datatest.index)
datatest = datatest_conti.join(datatest_dummy)
X_test = datatest

# 标准化
stdsc = StandardScaler()
X_train_conti_std = stdsc.fit_transform(X_train[['Age', 'SibSp', 'Parch', 'Fare']])
X_test_conti_std = stdsc.fit_transform(X_test[['Age', 'SibSp', 'Parch', 'Fare']])
# 将ndarray转为datatrainframe
X_train_conti_std = pd.DataFrame(data=X_train_conti_std, columns=['Age', 'SibSp', 'Parch', 'Fare'], index=X_train.index)
X_test_conti_std = pd.DataFrame(data=X_test_conti_std, columns=['Age', 'SibSp', 'Parch', 'Fare'], index=X_test.index)

# 有序分类变量Pclass
X_train_cat = X_train[['Pclass']]
X_test_cat = X_test[['Pclass']]
# 无序已编码的分类变量
X_train_dummy = X_train[['Sex_female', 'Sex_male', 'Embarked_C', 'Embarked_Q', 'Embarked_S']]
X_test_dummy = X_test[['Sex_female', 'Sex_male', 'Embarked_C', 'Embarked_Q', 'Embarked_S']]
# 拼接为datatrainframe
X_train_set = [X_train_cat, X_train_conti_std, X_train_dummy]
X_test_set = [X_test_cat, X_test_conti_std, X_test_dummy]
X_train = pd.concat(X_train_set, axis=1)
X_test = pd.concat(X_test_set, axis=1)

clf = BernoulliNB()
clf.fit(X_train, y_train)
predicted = clf.predict(X_test)
data_test['Survived'] = predicted.astype(int)
data_test[['PassengerId','Survived']].to_csv('submission.csv', sep=',', index=False)
发布了29 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_29153321/article/details/80025707