特征工程目的:把数据转换成机器更容易识别的数据
scikit-learn:提供几个常见的实用程序函数和转换器类,以将原始特征向量更改为更适合下游估计器的表示形式。即通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
特征的单位或大小相差较大,或某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征,故需要进行归一化/标准化处理
需要用到一些方法进行无量纲化,使不同规格的数据转换到同一规格,包括归一化和标准化
归一化:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
公式如下
作用于每一列,max为一列的最大值,min为一列的最小值,那么 X'' 为最终结果,mx,mi分别为指定区间值默认mx为1,mi为0,举例如下
使用API函数如下
代码如下,海伦约会数据dating.txt文件见文末网盘链接
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
data = pd.read_csv("../data/dating.txt")
print(data)
transfer = MinMaxScaler(feature_range=(0, 1)) # 实例化一个转换器类
minmax_data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']]) # 调用fit_transform
print("最小值最大值归一化处理后的结果:\n", minmax_data)
-------------------------------------------------------------
输出:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
4 38344 1.669788 0.134296 1
.. ... ... ... ...
995 11145 3.410627 0.631838 2
996 68846 9.974715 0.669787 1
997 26575 10.650102 0.866627 3
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
最小值最大值归一化处理后的结果:
[[0.44832535 0.39805139 0.56233353]
[0.15873259 0.34195467 0.98724416]
[0.28542943 0.06892523 0.47449629]
...
[0.29115949 0.50910294 0.51079493]
[0.52711097 0.43665451 0.4290048 ]
[0.47940793 0.3768091 0.78571804]]
最大值最小值是变化的,容易受异常点影响,所以该方法鲁棒性较差,只适合传统精确小数据场景
标准化:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内的数据
公式如下
作用于每一列,mean为平均值,σ为标准差
API如下
from sklearn.preprocessing import StandardScaler
import pandas as pd
data = pd.read_csv("../data/dating.txt")
print(data)
transfer = StandardScaler() # 实例化一个转换器
minmax_data = transfer.fit_transform(data[['milage', 'Liters', 'Consumtime']]) # 调用fit_transform
print("最小值最大值标准化处理后的结果:\n", minmax_data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)
-------------------------------------------------------
输出:
milage Liters Consumtime target
0 40920 8.326976 0.953952 3
1 14488 7.153469 1.673904 2
2 26052 1.441871 0.805124 1
3 75136 13.147394 0.428964 1
4 38344 1.669788 0.134296 1
.. ... ... ... ...
995 11145 3.410627 0.631838 2
996 68846 9.974715 0.669787 1
997 26575 10.650102 0.866627 3
998 48111 9.134528 0.728045 3
999 43757 7.882601 1.332446 3
[1000 rows x 4 columns]
最小值最大值标准化处理后的结果:
[[ 0.33193158 0.41660188 0.24523407]
[-0.87247784 0.13992897 1.69385734]
[-0.34554872 -1.20667094 -0.05422437]
...
[-0.32171752 0.96431572 0.06952649]
[ 0.65959911 0.60699509 -0.20931587]
[ 0.46120328 0.31183342 1.00680598]]
每一列特征的平均值:
[3.36354210e+04 6.55996083e+00 8.32072997e-01]
每一列特征的方差:
[4.81628039e+08 1.79902874e+01 2.46999554e-01]
标准化在已有样本足够多的情况下比较稳定,适合大数据场景
近邻算法API
Iris数据集
代码如下
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier # 导入模块
# 1.获取数据集
iris = load_iris()
# 2.数据基本处理
# x_train,x_test,y_train,y_test为训练集特征值、测试集特征值、训练集目标值、测试集目标值
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22) # 划分数据集
# 3.特征工程:标准化
transfer = StandardScaler() # 实例化转换器
x_train = transfer.fit_transform(x_train) # 调用方法,标准化
x_test = transfer.transform(x_test)
# 4.机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=2) # 实例化一个估计器,n_neighbors为选定参考的邻居数
estimator.fit(x_train, y_train) # 模型训练
# 5.模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:", y_predict)
print("比对真实值和预测值:", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:", score)
-----------------------------------------------
输出:
预测结果为: [0 2 1 2 1 1 1 2 1 0 2 1 2 2 0 2 1 1 1 1 0 2 0 1 2 0 2 2 2 2]
比对真实值和预测值: [ True True True True True True True True True True True True
True True True True True True False True True True True True
True True True True True True]
准确率为: 0.9666666666666667
海伦约会数据dating.txt获取下载:https://pan.baidu.com/s/1JFrp-3YQyH_zFBwWulNqmQ?pwd=68ww
学习导航:http://xqnav.top/