预处理
1. 删除缺失值
a. 删除行即样本(对于样本如果输出变量存在缺失的则直接删除该行,因为无法用该样本训练)
b. 删除列,即特征(采用这种删除方式,应保证训练集和验证集都应当删除相同的特征)
cols_with_missing = [col for col in original_data.columns if original_data[col].isnull().any()] redued_original_data = original_data.drop(cols_with_missing, axis=1) reduced_test_data = test_data.drop(cols_with_missing, axis=1)
2. 插值
a.直接插值—使用sklearn的Impution类进行插值
from sklearn.preprocessing import Imputer my_imputer = Imputer() data_with_imputed_values = my_imputer.fit_transform(original_data)
b.使用sklearn的Impution类进行插值,同时增加额外的列,保存缺失值的信息(新增列为0或者1取值)
cols_with_missing = (col for col in new_data.columns if new_data[col].isnull().any()) for col in cols_with_missing: new_data[col + '_was_missing'] = new_data[col].isnull() my_imputer = Imputer() 5 new_data = my_imputer.fit_transform(new_data) #注意返回值为数组格式,丢失列标,可通过DataFrame的columns属性进行找回
注意:fit_transform与transform的区别在于fit会先去拟合数据得到参数例如均值,方差,然后将参数用于数据转换,一般先用训练集去fit获取相关参数,然后再用训练集的参数去transform(这里指插值)训练集和测试 集保证,训练集和测试集基与同一参数进行转换
3. 处理分类变量
独热编码One-hot encode,通过将对分类变量的每个属性值映射为0和1对象,生成新的列,如下图所示,如果有十种属性则生成10列只有0和1取值的新列。
通常处理的时候使用DataFrame.nunique方法统计每一类的种类数,如种类数太多(建议不超过:15)的话,不建议进行独热编码
pandas里面有get_dumpies函数可以处理(默认只针对字符串及Object对象进行编码),sklearn里面有OneHotEncoder,只针对数字(好像很少用)
>>> df = pd.DataFrame({ 0 a b 1 1 b a 2 2 a c 3 >>> 0 1 1 0 0 1 1 2 0 1 1 2 3 1 0 0 0 1
s-折交叉验证