代码提要如下,具体输出信息不予展示
imoprt pandas as pd
data=pd.read_csv('D:\Tianic\Train.csv')
data.info()
data.describe()
以上数据共有12个变量
数值变量7个:int64(PassengerID,Survived,Pclass,SibSp,Parch)–891
float64(Age–714,Fare–891)
属性变量5个: object((Name,Sex,Ticket)–891,Cabin–204,Embarked–889)
对以上变量进行简要分析:
对,数值变量:
PassengerID–用不到,Survived–存活率,作为label
Pclass–社会经济地位,用得到,SibSp–船上兄弟姐妹或者配偶的数量,可能用得到
Parch–船上父母或者孩子的数量,可能用得到(可能和age有关??)
Age–用得到,但其数量,不到891,不全,需要补全它
Fare–船票价格,用得到
对属性变量:
Name–每个人名字里包含Mr,Mrs,Miss,故用得到,可将Mr,Mrs,Miss提取出,进行编码
Sex–该属性很重要,用得到,需要进行编码
Carbin–可能有用,但数量太小,忍痛扔掉吧
Embarked–登船地点,这个,可能有点很小的用途
Ticket–船票号码,用不到
数值变量中,Survived,Pclass,SibSp,Parch,Age,Fare选做我们需要的特征变量
其中,Age需要补全,如何补全?最简单方法,均值,中位数填充,但是会但来较大的误差,好的方法?用其他变量估计缺失变量的值,前面R语言数据预处理中也有讲过,如装袋树填充:https://blog.csdn.net/lulujiang1996/article/details/78808577
相对来讲误差小一些。
属性变量中,Name,Sex,Embarked选做我们需要的特征变量
但需要进行编码,如何编码?—编码即数值化
对于Name,其有,Mr,Mrs,Miss三个状态,最直接方法是,编码为0,1,2,但是,距离角度看,Mr和Mrs距离要小于Mr和Miss距离,不合适,故需要把他们看成平均的三个状态,采取方法–one-hot编码,即用100,010,001表示Mr,Mrs,Miss
对于Sex,可用0,1表示,也可用one-hot编码表示,00,01
对于Embarked,它只有三个状态变量,one-hot编码即可,100,010,001
对于数值变量,我们通常需要归一化处理,加快收敛速度(但不适合决策树一类算法)
故,对,Pclass,Fare,Sibsp,Parch,Age进行归一化处理,而Survived作为目标变量label
以下代码与以上描述略有出入,但不影响阅读,
#剔除变量
data.drop(['PassengerId','Ticket'],axis=1,inplace=True)
#补全Embarked变量
data.loc[data.Embarked.isnull(),'Embarked']='S'
#one-hot编码
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import LabelEncoder
#ohe_pclass=OneHotEncoder(sparse=False).fit(data[['Pclass']])
#Pclass_ohe=ohe_pclass.transform(data[['Pclass']])
le_sex=LabelEncoder().fit(data['Sex'])
Sex_label=le_sex.transform(data['Sex'])
ohe_sex=OneHotEncoder(sparse=False).fit(Sex_label.reshape(-1,1))
Sex_ohe=ohe_sex.transform(Sex_label.reshape(-1,1))
le_embarked=LabelEncoder().fit(data['Embarked'])
Embarked_label=le_embarked.transform(data['Embarked'])
ohe_embarked=OneHotEncoder(sparse=False).fit(Embarked_label.reshape(-1,1))
Embarked_ohe=ohe_embarked.transform(Embarked_label.reshape(-1,1))
def replace_name(x):
if 'Mrs' in x:
return 'Mrs'
elif 'Mr' in x:
return 'Mr'
else:
return 'Miss'
data['Name']=data['Name'].map(lambda x:replace_name(x))
le_name=LabelEncoder().fit(data['Name'])
Name_label=le_name.transform(data['Name'])
ohe_name=OneHotEncoder(sparse=False).fit(Name_label.reshape(-1,1))
Name_ohe=ohe_name.transform(Name_label.reshape(-1,1))
data['Sex_0']=Sex_ohe[:,0]
data['Sex_1']=Sex_ohe[:,1]
data['Embarked_0']=Embarked_ohe[:,0]
data['Embarked_1']=Embarked_ohe[:,1]
data['Embarked_2']=Embarked_ohe[:,2]
data['Name_0']=Name_ohe[:,0]
data['Name_1']=Name_ohe[:,1]
data['Name_2']=Name_ohe[:,2]
#归一化处理
from sklearn.preprocessing import StandardScaler
Pclass_scale=StandardScaler().fit(data['Pclass'])
data['Pclass_scaled']=StandardScaler().fit_transform(data['Pclass'].reshape(-1,1),Pclass_scale)
Fare_scale=StandardScaler().fit(data['Fare'])
data['Fare_scaled']=StandardScaler().fit_transform(data['Fare'].reshape(-1,1),Fare_scale)
SibSp_scale=StandardScaler().fit(data['SibSp'])
data['SibSp_scaled']=StandardScaler().fit_transform(data['SibSp'].reshape(-1,1),SibSp_scale)
Parch_scale=StandardScaler().fit(data['Parch'])
data['Parch_scaled']=StandardScaler().fit_transform(data['Parch'].reshape(-1,1),Parch_scale)
#预测年纪并补全
from sklearn.ensemble import RandomForestRegressor
def set_missing_age(data):
train=data[['Age','SibSp_scaled','Parch_scaled','Name_0','Name_1','Name_2','Sex_0','Sex_1']]
known_age=train[train.Age.notnull()].as_matrix()
unknown_age=train[train.Age.isnull()].as_matrix()
y=known_age[:,0]
x=known_age[:,1:]
rf=RandomForestRegressor(random_state=0,n_estimators=200,n_jobs=-1)
rf.fit(x,y)
print rf.score(x,y)
predictage=rf.predict(unknown_age[:,1:])
data.loc[data.Age.isnull(),'Age']=predictage
return data,rf
data,rf=set_missing_age(data)
Age_scale=StandardScaler().fit(data['Age'])
data['Age_scaled']=StandardScaler().fit_transform(data['Age'].reshape(-1,1),Age_scale)
train_x=data[['Sex_0','Sex_1','Embarked_0','Embarked_1','Embarked_2','Name_0','Name_1','Name_2','Pclass_scaled','Age_scaled','Fare_scaled']].as_matrix()
train_y=data['Survived'].as_matrix()
首先,这是一个分类问题,我们可以选择,逻辑回归(它是分类器!!!),决策树,boost算法(GDBT,AdaBoost,RandomForest,最牛逼的XGboost)(笔者有时间会将这些算法总结一下,尽请关注!),svm,聚类算法(无监督学习),这里选择逻辑回归,svm,randomForest和GDBT分类器做一下,代码如下:
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
x_tr,x_te,y_tr,y_te=train_test_split(train_x,train_y,test_size=0.3,random_state=0)
lr=LogisticRegression(C=1.0,tol=1e-6)
lr.fit(x_tr,y_tr)
print lr.score(x_te,y_te)
from sklearn.svm import SVC
#注意svc的随机性,可以将Random_state=1
svc=SVC(C=2, kernel='rbf', decision_function_shape='ovo')
svc.fit(x_tr,y_tr)
print svc.score(x_te,y_te)
from sklearn.ensemble import RandomForestClassifier
randomf=RandomForestClassifier(n_estimators=500,max_depth=5,random_state=0)
randomf.fit(x_tr,y_tr)
print randomf.score(x_te,y_te)
from sklearn.ensemble import GradientBoostingClassifier
gdbt=GradientBoostingClassifier(n_estimators=600,max_depth=5,random_state=0)
gdbt.fit(x_tr,y_tr)
print gdbt.score(x_te,y_te)
若用该模型进行预测,也需要我们对测试集做同样的事情,补全缺失值,one-hot编码,归一化等(适用于比赛,需要提交预测结果)
如何提高成绩?-选择相关性不大分类器,用它们预测的结果进行投票
from sklearn.ensemble import VotingClassifier
model=VotingClassifier(estimators=[('lr',lr),('svc',svc),('rf',randomf),('GDBT',gdbt)],voting='hard',weights=[0.5,1.5,0.6,0.6])
model.fit(x_tr,y_tr)
print model.score(x_te,y_te)