写在开头:这次的分享是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())的方法进行显示。
结语
今天的文章主要从数据的查看与初步的处理着手,讲解了部分处理的方法,具体处理的思路需要结合个人看法。后面我们会对第三步,数据可视化进行分享。
谢谢阅读。