Titanic Kaggle 竞赛技术小结(一)

写在开头:这次的分享是Kaggle比赛的入门级项目Titanic的一些技术上的小结,并且会展开某些技术上的细节进行说明。

相关重述

问题背景:泰坦尼克号是当时世界上体积最庞大、内部设施最豪华的客运轮船,在它的处女航中,泰坦尼克号便遭厄运——它从英国南安普敦出发,途经法国瑟堡-奥克特维尔以及爱尔兰科夫(Cobh),驶向美国纽约。1912年4月14日23时40分左右,泰坦尼克号与一座冰山相撞,造成右舷船艏至船中部破裂,五间水密舱进水。2224名船员及乘客中,1517人丧生,其中仅333具罹难者遗体被寻回。(摘自百度百科)
研究目标:通过已知的船上乘客信息来对乘客的生存状况进行预测。

技术总结

一、全文思路
Step1. 载入数据、包,并查看数据;
Step2. 对数据进行清洗,包括去重复值、异常值、缺失值或特征化数值化处理;
Step3. 利用数据可视化,寻找有价值的变量与变量分组;
Step4. 利用可行的机器学习、深度学习模型进行模型训练;
Step5. 对不同模型的效果进行评估,交叉验证、重要变量筛选、查准率、查全率、F值、ROC-AUC等进行评价;
Step6. 保存数据,结束。

二、关键程序
(此处不展示完整分析过程与代码,只对使用到的函数进行总结,完整项目可见后续文章)
Step1. 载入数据、包,并查看数据

#常见包
import pandas as pd #载入处理数据包
import numpy as np
import matplotlib.pyplot as plt #载入绘图包
import seaborn as sns
%matplotlib inline
from termcolor import * #载入改变字体颜色包

#机器学习包-二分类问题
#常见方法模型:LR、随机森林、感知机、梯度下降、DT、KNN、支持向量机、贝叶斯分类器
from sklearn import linear_model
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC, LinearSVC
from sklearn.naive_bayes import GaussianNB

#加载CSV文件
train_df = pd.read_csv("..\data.csv")

#数据查看
train_df.shape #返回DataFrame的行列
train_df.columns #返回DataFrame列名
train_df.info() #返回列名、数据量、类型

Step2. 对数据进行清洗,包括去重复值、缺失值、异常值或特征化数值化处理
1)重复值处理

train_df.drop_duplicates() #去除文中变量完全重复的样本

解释:
drop_duplicates():添加变量名和last,添加变量名意味着如果不同样本的这两列同时发生重复,那么就删除该样本数据;last表示保留重复值中的最后一个样本。

#扩展
train_df.drop_duplicates(['PassengerID', 'Name'], 'last')

2)缺失值处理

# 变量缺失情况展示
nulls = np.sum(train_df.isnull())
nullcols = nulls.loc[(nulls!=0)]
dtypes2 = train_df.dtypes.loc[(nulls!=0)] #DataFrame.dtypes展示变量类别
info = pd.concat([nullcols, dtypes2], axis=1).sort_values(by=0,ascending=False)
print(info)
print("There are", len(nullcols), "columns with missing values")
            0        1
Age       177  float64
Cabin     687   object
Embarked    2   object
There are 3 columns with missing values

解释
np.sum():axis=0表示按照列进行加和,axis=1表示按照行进行加和;
pd.concat():axis=1表示的行名唯一,也就是说按照变量名来一条条展示数据和类型,axis=0时表示的列名唯一,也就是竖着一条展示下来;
sort_values():axis=0,则在by中输入列名,如果axis=1,则在by中输入行名,然后按照by的制定进行排序;ascending = True按升序排列, Flase按降序排列。

#数据填充示例
#连续性数据填充
train_df['Age'] = train_df['Age'].fillna(train_df['Age'].median()) 
#离散性数据填充
train_df['Embarked'] = train_df['Embarked'].fillna(train_df['Embarked'].mode()[0])

解释:
Data.fillna():可以在括号内填充需要填充的值,也可以通过设置参数method=‘ffil’利用前面的值填充后面的值或者method=‘bfill’利用后面的值填前面的值。

import numpy as np
from numpy import nan
import pandas as pd
data = pd.DataFrame(np.arange(1,10,1).reshape(3,3), index=list('xyz'))
data.iloc[1:2, 0:3]=nan
print(data)
     0    1    2
x  1.0  2.0  3.0
y  NaN  NaN  NaN
z  7.0  8.0  9.0
print(data.fillna(method='bfill'))#后面的值填充前面的值
print(data.fillna(method='ffill'))#前面的值填充后面的值
     0    1    2
x  1.0  2.0  3.0
y  7.0  8.0  9.0
z  7.0  8.0  9.0

     0    1    2
x  1.0  2.0  3.0
y  1.0  2.0  3.0
z  7.0  8.0  9.0

3)异常值处理

#性别数量
print(test_df.loc[:,'Sex'].value_counts())
# 查看年龄的分布有无异常
#3.3.2 查看年龄的分布
plt.figure(3, figsize=(20,20))
Age_data = {
    "Age of train data":train_df['Age']
    }
df = pd.DataFrame(Age_data)
df.boxplot()
plt.ylabel('Age', fontsize=30, color='w')
plt.yticks(fontsize=30, color='w')#纵轴标签
plt.xticks(fontsize=30, color='w')#横轴标签
male      577
female    314
Name: Sex, dtype: int64

在这里插入图片描述
通过箱线图查看连续性数据的分布有无查过统计学意义正常范围,并且对超过的数据进行定性的理解,判断其存在是否合理;对于离散型数据则可以首先判断是否存在非常规的错误值,然后再对非常规值进行删除或者填充。

#连续性数据选取
train_df = train_df[train_df.Age < 80]

4)特征数值化处理

#对年龄进行分组处理
data = [train_df, test_df]
for data_set in data:
    data_set['Age'] = data_set['Age'].astype(int)
    data_set[data_set.Age<3].loc[:,'Survived'] = 0
    data_set[data_set.Age>=3][data_set.Age<12].loc[:,'Survived'] = 1
    data_set[data_set.Age>=12][data_set.Age<18].loc[:,'Survived'] = 2
    data_set[data_set.Age>=18][data_set.Age<30].loc[:,'Survived'] = 3
    data_set[data_set.Age>=30][data_set.Age<60].loc[:,'Survived'] = 4
    data_set[data_set.Age>=60].loc[:,'Survived'] = 6
#对登船点进行数值化处理
ports= {"S":0, "C":1, "Q":2}
for data_set in train_df:
    data_set['Embarked']=data_set['Embarked'].map(ports)

这里举一个简单的例子,将不同年龄段进行分组处理,对登陆点的字符型数据数值化处理。
解释
map:根据提供的函数对制定数据进行映射,此处是将数据进行字典的映射

def square(x) :            # 计算平方数
	return x ** 2

print(list(map(square, [1,2,3,4,5])))   # 计算列表各个元素的平方
[1, 4, 9, 16, 25]

这里需要注意map函数打印可以使用print(list())的方法进行显示。
结语
今天的文章主要从数据的查看与初步的处理着手,讲解了部分处理的方法,具体处理的思路需要结合个人看法。后面我们会对第三步,数据可视化进行分享。
谢谢阅读。

发布了3 篇原创文章 · 获赞 9 · 访问量 124

猜你喜欢

转载自blog.csdn.net/qq_35149632/article/details/104304351
今日推荐