上一章节中总结了scikit learn库中提供的机器学习算法。本节总结一下样本数据预处理相关知识。
1、处理存在缺失特征的样本数据
简单粗暴的方式是将含有缺失值得行或列删除:
df.dropna() #删除含有缺失值的行
df.dropna(axis=1) #删除含有缺失值的列
df.dropna(how='all') #删除所有值都缺失的行
df.dropna(thresh=4) #删除缺失4个值以上的行
df.dropna(subset=['C']) #删除特定列C的值缺失的行
采用删除的方式,会丢失有价值的数据,一般不采用。经常采用插值技术补全缺失数据。即缺失的值用行或列上的特征均值做补充。
from sklearn.preprocessing import Imputer
imr = Imputer(missing_value='NaN', #要替换的值
strategy='mean', #采用的策略为均值法 或'most_frequent'取出现频率最高的值
axis=0) #0表示取列上的特征均值,1表示取行上的特征均值
imr = imr.fit(df)
imputed_data = imr.transform(df.values)
2、算法分类
上节中介绍的算法是预估器,本节主要介绍的是对样本数据进行预处理的转换器。scikit learn库中预估器API接口基本上是一致的,都提供了fit、predict方法,有的还提供了predict_proba、partial_fit方法。而转换器则都提供了fit、transform、fit_transform(fit和transform功能的组合)方法。
3、特征处理
样本数据中有的数据是非数字类型的,比如表示衣服大小的XL、L、M,表示颜色的红、蓝、绿。为了能让预估器和转换器正常工作,我们需要将这种特征转换为数字类型的。对于有序类型的特征,我们可直接将其转换为对应的整数。但对于无序特征,如颜色值,则不能简单的进行转换,而是需要将其转换为多个特征,以抵消转换为数字后带来的顺序影响。
1) 有序非数字的特征转换
size_mapping = {'XL':3, 'L':2, 'M':1}
df['size'] = df['size'].map(size_mapping)
或使用sklearn库中的列表处理算法
from sklearn.preprocessing import LabelEncoder
class_le = LabelEncoder()
df['size'] = class_le.fit_transform(df['size'].values)
注意:LabelEncoder常用于处理类标数据,将文本的数据分别编码为0、1、2、3...
2)无序的非数字的特征转换----独热编码技术
X = df[['color','size','price']].values
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(categorical_features=[0]) #指定要转换的特征位置在第0列
ohe.fit_transform(X).toarray() #ohe.fit_transform返回的是稀疏矩阵,调用toarray方法得到正常矩阵
pandas中的get_dummies方法将df数据中的字符串列进行独热转换:
pd.get_dummies(df[['price','color','size']])
4、将数据集划分为训练数据集和测试数据集
import Pandas as pd
import numpy as np
df = pd.read_cvs("文件路径",hearder=None)
y=df.iloc[0:100, 4].values #抽取0--100行,第4列数据
y=np.where(y=='Iris-setosa',-1,1) #向量推导
X=df.iloc[0:100, [0,2]].values #抽取0--100行,第0列,第2列数据
#这里已将样本数据及分类结果抽取出来了,下面需要将样本数据分为训练数据和测试数据
from sklearn.cross_validation import train_test_split
X_train,X_test,Y_train,Y_test = train_test_split(X, y, test_size=0.3,random_state=0)
5、将特征压缩到相同区间
1)归一化----将特征值缩放到区间[0,1],对每个列取到最大值Max和最小值Min,转换列上的值X = (X0 - Min) / (Max - X0),其中X0为原始值,X为变换后的值。
from sklearn.preprocessing import MinMaxScaler
mms = MinMaxScaler()
X_train_norm = mms.fit_transform(X_train)
X_test_norm = mms.tranform(X_test)
2)标准化----通过标准化,将列的特征值变换为均值为0,方差为1,使得特征列的值呈正态分布。多数算法可采用标准化进行数据预处理提高准确性。
from sklearn.preprocessing import StandardScaler
stdsc = StandardScaler()
X_train_std = stdsc.fit_transform(X_train)
X_test_std = stdsc.tranform(X_test)
6、解决过拟合的方式:正则化和特征选择
支持正则化的算法,默认采用L2正则化,但对于高维数据集中含有大量的不相关特征列,可用L1正则化得到稀疏矩阵,进而来做特征选择。(上一节中介绍的构造函数中的参数C用来调整正则化力度)
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression(C=0.1,random_state=0,penalty='l1')
lr.fit(X_train_std, Y_train) #训练模型
lr.score(X_train_std, Y_train) #得到模型在训练数据集上的准确率
lr.score(X_test_std, Y_test) #得到模型在测试数据集上的准确率
lr.coef_ #得到特征在每个分类上的权重,有的特征在某一分类无效,对另一分类有效
7、有的算法正则化无效,则可以采用特征选择方法进行降维
1)贪心算法:样本数据特征数量为d,降为k个特征。原理是在这些特征中找到一个特征,删除后对模型准确率影响最小;删除这个特征,直到剩余的特征数量为k。需自己实现,代码网上查找。
2)随机森林算法训练后,在feature_importances_属性中得到个特征的重要性。注意样本数据无需标准化或归一化处理。
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(criterion='entropy',
n_estimators=10, #决策树数量
random_state=0,
n_jobs=2) #使用几个CPU内核进行计算
forest.fit(X_train,Y_train)
forest.feature_importances_ #依据此值绘制出特征的重要性,选取前几个特征组合进行训练、预测