Python机器学习----第2部分 样本数据预处理

上一章节中总结了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_  #依据此值绘制出特征的重要性,选取前几个特征组合进行训练、预测







  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值