预处理
1. 删除缺失值
a. 删除行即样本(对于样本如果输出变量存在缺失的则直接删除该行,因为无法用该样本训练)
b. 删除列,即特征(采用这种删除方式,应保证训练集和验证集都应当删除相同的特征)
1 cols_with_missing = [col for col in original_data.columns 2 if original_data[col].isnull().any()] 3 redued_original_data = original_data.drop(cols_with_missing, axis=1) 4 reduced_test_data = test_data.drop(cols_with_missing, axis=1)
2. 插值
a.直接插值—使用sklearn的Impution类进行插值
1 from sklearn.preprocessing import Imputer 2 my_imputer = Imputer() 3 data_with_imputed_values = my_imputer.fit_transform(original_data)
b.使用sklearn的Impution类进行插值,同时增加额外的列,保存缺失值的信息(新增列为0或者1取值)
1 cols_with_missing = (col for col in new_data.columns if new_data[col].isnull().any()) 2 for col in cols_with_missing: 3 new_data[col + '_was_missing'] = new_data[col].isnull() 4 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,只针对数字(好像很少用)
1 >>> df = pd.DataFrame({'A': ['a', 'b', 'a'], 'B': ['b', 'a', 'c'], 'C': [1, 2, 3]}) 2 输出: 3 A B C 4 0 a b 1 5 1 b a 2 6 2 a c 3 7 8 >>> pd.get_dummies(df) 9 输出: 10 C A_a A_b B_a B_b B_c 11 0 1 1 0 0 1 0 12 1 2 0 1 1 0 0 13 2 3 1 0 0 0 1
s-折交叉验证