监督学习常用预处理方法


最近在复习数据科学与机器学习方面的相关知识, 就在博客上简单记下要点。参考《Python机器学习经典实例》这本书。

1.数据预处理

几个数据预处理的基础技术:

  • 均值移除(mean removal)
    通常我们会把每个特征的平均值移除,保证特征均值为0,这样能够消除特征彼此间的偏差。

  • 范围缩放(scaling)
    当数据点中每个特征的数值范围很大时,可以考虑将特征的数值范围缩放到某一区间。

  • 归一化(normalization)
    归一化用于需要对特征向量的值进行调整时,保证每个特征向量的值都缩放到相同数值范围。可以看作是用占比表示特征。

  • 二值化(binarization)
    二值化用于将数值特征向量转换为布尔类型向量。一般会设定一个阈值。

  • 独热编码(one-hot encoding)
    独热编码把特征向量的每个特征与特征的非重复总数相对应,通过` o n e − h o t − k one-hot-k onehotk的形式对每个值进行编码,有点抽象,可以看下面的例子理解。

在Python中使用sklearn中preprocessing包实现这些基础操作。

import numpy as np
from sklearn import preprocessing
data=np.array([[3,-1.5,2,-5.4],[0,4,-0.3,2.1],[1,3.3,-1.9,-4.3]])

# 均值移除,axis=0进行列操作,特征均值基本为0,标准差为1
data_standardized=preprocessing.scale(data,axis=0)
print(data_standardized)
print("\nMean =", data_standardized.mean(axis=0))
print ("Std deviation =", data_standardized.std(axis=0))
# out
[[ 1.33630621 -1.40451644  1.29110641 -0.86687558]
 [-1.06904497  0.84543708 -0.14577008  1.40111286]
 [-0.26726124  0.55907936 -1.14533633 -0.53423728]]
Mean = [ 5.55111512e-17 -1.11022302e-16 -7.40148683e-17 -7.40148683e-17]
Std deviation = [1. 1. 1. 1.]

#范围缩放
data_scaler=preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaled=data_scaler.fit_transform(data)
print(data_scaled)
#out
[[1.         0.         1.         0.        ]
 [0.         1.         0.41025641 1.        ]
 [0.33333333 0.87272727 0.         0.14666667]]

#归一化
data_normalized=preprocessing.normalize(data,norm="l1")
print(data_normalized)
#out
[[ 0.25210084 -0.12605042  0.16806723 -0.45378151]
 [ 0.          0.625      -0.046875    0.328125  ]
 [ 0.0952381   0.31428571 -0.18095238 -0.40952381]]

#二值化
data_binarized=preprocessing.Binarizer(threshold=2).transform(data)
print(data_binarized)
#out
[[1. 0. 0. 0.]
 [0. 1. 0. 1.]
 [0. 1. 0. 0.]]

#独热编码
encoder=preprocessing.OneHotEncoder()
encoder.fit([[0,2,1,12],[1,3,5,3],[2,3,2,12],[1,2,4,3]])
encoder_vector=encoder.transform([[2,3,5,3]]).toarray()
print(encoder_vector)
#out
#例如,第三列特征有1,5,2,4,独热编码向量的长度就是4,1是1000,2是0100,4是0010,5是0001,其他列也这样编码
[[0. 0. 1. 0. 1. 0. 0. 0. 1. 1. 0.]]

2.标记编码方法

from sklearn import preprocessing
label_encoder=preprocessing.LabelEncoder()
input_classes=['beijing','shanghai','guangzhou','shenzhen']
label_encoder.fit(input_classes)
#编码
labels=['beijing','shenzhen']
encoded_labels=label_encoder.transform(labels)
print(list(encoded_labels))
#out 默认会对标记排序
[0, 3]
#解码
encoded_labels=[2,1,0,3,1]
decoded_labels=label_encoder.inverse_transform(encoded_labels)
print(list(decoded_labels))
#out
['shanghai', 'guangzhou', 'beijing', 'shenzhen', 'guangzhou']

3.回归准确性

在评价回归器的拟合效果中,常用的指标如下:

  • 平均绝对误差:给定数据集中所有数据点的绝对误差均值。
  • 均方误差:给定数据集中所有数据点的误差的平方的均值。
  • 中位数绝对误差:给定数据集中所有数据点的误差的中位数。
  • 解释方差分:衡量模型对数据集波动的解释能力,1表示模型完美。
  • R方得分:衡量模型对未知样本预测的效果。

scikit-learn中提供了相应的模块,使用也非常方便。

#每行依次表示上述指标
import sklearn.metrics as sm
print(round(sm.mean_absolute_error(y_test,y_test_pred),2))
print(round(sm.mean_squared_error(y_test,y_test_pred),2))
print(round(sm.median_absolute_error(y_test,y_test_pred),2))
print(round(sm.explained_variance_score(y_test,y_test_pred),2))
print(round(sm.r2_score(y_test,y_test_pred),2))

4.简单回归器

  1. 线性回归器
    线性回归器是最简单的回归器,用直线来拟合数据点,示例如下:
#X_train.shape,y_train.shape为(40, 1),(40,)
from sklearn import linear_model
import matplotlib.pyplot as plt
linear_regressor=linear_model.LinearRegression()
linear_regressor.fit(X_train,y_train)
y_train_pred=linear_regressor.predict(X_train)
plt.figure()
plt.scatter(X_train,y_train,color='green')
plt.plot(X_train,y_train_pred,color='black',linewidth=4)
plt.show()

在这里插入图片描述

  1. 岭回归器
    为了避免直线不是最优等情况,可以引入正则化项的系数作为阈值来消除异常值的影响。这个方法称为岭回归。
#alpha参数控制回归器的复杂程度,对异常值降低敏感度就需要设置较大的值
ridge_regressor=linear_model.Ridge(alpha=0.0001,fit_intercept=True,max_iter=10000)
ridge_regressor.fit(X_train,y_train)
y_test_pred_ridge=ridge_regressor.predict(X_test)
  1. 多项式回归器
    多项式回归器用曲线来拟合数据点。这里书上讲的不是很清楚,一般情况下也不怎么用preprocessing包来实现多项式回归。参考这篇博客讲的比较好。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值