数据分析师养成之路--python实战分类案例1

数据预处理与特征工程

代码提要如下,具体输出信息不予展示

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)  

猜你喜欢

转载自blog.csdn.net/lulujiang1996/article/details/80743099