Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

1.预处理
当我们拿到一批原始数据以后,需要考虑以下问题:
1)首先要明确有多少特征,哪些是连续的,哪些是类别特征。
2)检查有没有缺失值,选择合适的缺失值填补方法,使数据保持完整。
3)对连续的数值型变量进行标准化,使得均值为0,方差为1。
4)对类别型的特征进行one-hot编码
5)将需要转换成类别型数据的连续型数据进行二值化
6)为防止过拟合或者其他原因,选择是否要将数据进行正则化

介绍一些pandas中常用的方法:
以ijcai-18中的训练集为例子
#数据概览
df.info()
Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记
可以看到数据包含了哪些列(特征),每列有多少非空数据,数据的类型等信息,其中object类型可以看作是String类型。

df.describe()
Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记
数据的基本信息,主要是统计信息。主要看那些数值型的数据才有意义。

df.head() #查看表头,一般显示数据的前5行
Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

df.tail() #查看表尾,无参情况下显示数据的最后5行
Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

df['user_age_level'].hist() #查看变量分布

df['user_age_level'].value_counts() #查看这一列的值的统计

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

df['user_age_level'].unique() #查看数据取值

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

df.isnull().sum() #查看每一列缺失值情况,参数中axis=1,查看的是每一行缺失值的情况,例如
df['nan_num'] = df.isnull.sum(axis=1)

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

显然由于数据的原因,每一列都没有缺失值,因为本数据中的缺失值都用-1进行表示了。


#缺失值填充
mode_df = df.fillna(df.mode().iloc[0],inplace =True)
df.mode() #众值 df.median() #中位数

#连续特征规范化处理
from sklearn.preprocessing import MinMaxScaler,Normalizer,StandardScaler
scaler = StandardScaler() #0均值,单位方差
scaler = MinMaxScaler(feature_range=(0,1)) # 变换到【0,1】区间(也可以是其他固定最大最小的区间)
scaler = Normalizer(norm='l1') # 'l1','l2','max','optional'('l2' by default)
df['shop_review_positive_rate'] = StandardScaler().fit_transform(df['shop_review_positive_rate'].values.reshape(-1,1))
这是一种偷懒的写法,实际应该先fit,再transform。

用rank()排序的方法解决异常值的敏感问题
df['shop_review_positive_rate'] = df['shop_review_positive_rate'].rank()


#类别特征的规范化处理
data = pd.get_dummies(df,columns=['user_gender_id],dummy_na=True) #获得哑变量
哑变量:虚拟变量 ( Dummy Variables) 又称虚设变量、名义变量或哑变量,用以反映质的属性的一个人工变量,是量化了的自变量,通常取值为0或1。适用于数量小的数据集。是一种稠密的表达。
稀疏的表达要用到下面的方法:
from sklearn.preprocssing import LabelEncoder,OneHotEncoder
from scipy import sparse
df['user_gender_id] = LabelEncoder().fit_transform(df['user_gender_id'])
data = sparse.hstack((df,OneHotEncoder.fit_transform(df['user_gender_id])))
LabelEncoder作用是进行编码,有利于后续的计算。不能对int和str进行比较,所以值要进行统一。
OneHotEncoder生成的数据是稀疏的,要用sparse中的hstack进行拼接(横向的拼接)。
在这部分操作之前要将训练集和测试集提前分开再进行one-hot。


#文本向量化
from sklearn.feature_extraction.txt import CountVectorizer
df['item_category_list'] = df['item_category_list'].apply(lambda x: " ".join(x.split(";")))
处理前:

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

处理后:

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

item_category_list = CountVectorizer().fit_transform(df['item_category_list'])
df = sparse.hstack((item_category_list,df))
例子:
’a b c‘ => 1 1 1 0
'a e' => 1 0 0 1

#连续特征离散化
pd.cut(df['item_pv_level'],bins=[0,5,10,15,20]).head()

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

#特征二值化
from sklearn.preprocessing import Binarizer
df['item_pv_level'] = Binarizer(threshold = 10).fit_transform(df['item_pv_level'] .values.reshape(-1,1))
给定阈值变为0或1

第一部分总结:

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记


2.模型评估和参数搜索
2.1模型评估

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记


2.2 参数搜索

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

其他方法参考特征选择综述中的方法:如遗传算法,退火算法等。

3 模型融合

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

主要介绍 blend 和 stack ,其他模型融合的方法参考:
3.1 blend

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

首先将训练集划分成为5份,按照5折交叉验证的方法,其中4份作为训练集,另一份作为验证集,训练得到了5个模型。然后分别用这5个模型去预测其对应的验证集,并将结果合并(concat一下)。得到的验证集长度和训练集长度是一样的。

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

然后再用这5个模型去预测测试集,会得到5个结果,求平均。
训练时候使用的模型可以有很多选择,如lgb,xgb,rf等。

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

最后用许多模型的预测结果再训练一个神经网络或者逻辑回归,最终用该模型来预测test。

3.2stack

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

将训练集分成两份不相交的数据。

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

用其中一份训练一个模型,模型可以有多种选择。然后用这个模型去预测另一个训练集和测试集。

Bryan直播:sklearn入门:数据预处理、模型评估、模型融合——学习笔记

最后将预测的结果再训练一个模型(神经网络或者LR),最后去预测test。