1 哑变量
哑变量:利用类似pd.get_dummies得到的0,1数据
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.neural_network import MLPRegressor from sklearn.neighbors import KNeighborsRegressor from sklearn.preprocessing import OneHotEncoder#独热编码,同pd.get_dummies,但仅能用于整型变量 def base_for_dummies(): colour = pd.DataFrame({'数据特征':[1,2,3,4,5,6,7],'颜色类型':['赤','橙','黄','绿','青','蓝','紫']}) print(colour)
输出
数据特征颜色类型 0 1 赤 1 2 橙 2 3 黄 3 4 绿 4 5 青 5 6 蓝 6 7 紫 |
colour_dum = pd.get_dummies(colour) print(colour_dum) |
输出
数据特征 |
颜色类型_橙 |
颜色类型_紫 |
颜色类型_绿 |
颜色类型_蓝 |
颜色类型_赤 |
颜色类型_青 |
颜色类型_黄 |
|
0 |
1 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
1 |
2 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
2 |
3 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
3 |
4 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
4 |
5 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
5 |
6 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
6 |
7 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
colour['数据特征'] = colour['数据特征'].astype(str) colour_dum = pd.get_dummies(colour,columns=['数据特征']) print(colour_dum)
输出
颜色类型 |
数据特征_1 |
数据特征_2 |
数据特征_3 |
数据特征_4 |
数据特征_5 |
数据特征_6 |
数据特征_7 |
|
0 |
赤 |
1 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
橙 |
0 |
1 |
0 |
0 |
0 |
0 |
0 |
2 |
黄 |
0 |
0 |
1 |
0 |
0 |
0 |
0 |
3 |
绿 |
0 |
0 |
0 |
1 |
0 |
0 |
0 |
4 |
青 |
0 |
0 |
0 |
0 |
1 |
0 |
0 |
5 |
蓝 |
0 |
0 |
0 |
0 |
0 |
1 |
0 |
6 |
紫 |
0 |
0 |
0 |
0 |
0 |
0 |
1 |
2 装箱处理
#生成随机数列 rnd =np.random.RandomState(56) x =rnd.uniform(-5,5,size=50) #向数据添加噪音 y_no_noise =(np.cos(6*x)+x) X = x.reshape(-1,1) y = (y_no_noise +rnd.normal(size=len(x)))/2 plt.plot(X,y,'o',c='g') plt.show()
用MLPRegressor与KNeighborsRegressor进行拟合。
line = np.linspace(-5,5,1000,endpoint=False).reshape(-1,1) mlpr =MLPRegressor().fit(X,y) knr =KNeighborsRegressor().fit(X,y) plt.plot(line,mlpr.predict(line),label='MLP') plt.plot(line,knr.predict(line),label='KNN') plt.plot(X,y,'o',c='g') plt.legend(loc='best') plt.show()
MLPRegressor与KNeighborsRegressor拟合线是不一致的,下面我们通过装箱处理来逐步把二者变为一致。(digitize离散化处理,又称装箱处理)
#设置11个箱子 bins = np.linspace(-5,5,11) #将数据装箱 target_bin =np.digitize(X, bins=bins) print("装箱数据范围:\n{}".format(bins)) print("前10个数据点的特征值:\n{}".format(X[:10])) print("前10个数据点所在的箱子:\n{}".format(target_bin[:10]))
输出
装箱数据范围: [-5. -4. -3. -2. -1. 0. 1. 2. 3. 4. 5.] 前10个数据点的特征值: [[ 4.84191851] [-1.66587734] [ 1.73701625] [-3.03609583] [-1.45553535] [ 3.13365953] [-2.52150446] [-0.41388675] [ 3.77301421] [-1.08341539]] 前10个数据点所在的箱子: [[10] [ 4] [ 7] [ 2] [ 4] [ 9] [ 3] [ 5] [ 9] [ 4]]
分为了[-5,-4],[-4,-3],[-3,-2],[-2,-1],[-1,0],[0,1],[1,2],[2,3],[3,4],[4,5]10个箱子,如果数字在-5 ~ -4之间,放在第1个箱子;如果数字在-4 ~ -3之间,放在第2个箱子;…;如果数字在4 ~ 5之间,放在第10个箱子,所以第一数字为4.84191851,放在了第10个箱子;所以第一数字为-1.66587734,放在了第4个箱子…。
一般在机器学习中很少用get_dummies,经常使用OneHotEncoder独热编码,它与get_dummies类似产生哑变量,但是它仅适用于整数。
onehot = OneHotEncoder(sparse = False) onehot.fit(target_bin) #将独热编码转为数据 X_in_bin =onehot.transform(target_bin) print("装箱后的数据形态:\n{}".format(X_in_bin.shape)) print("装箱后的前10个数据点:\n{}".format(X_in_bin[:10]))
输出
装箱后的数据形态: (50, 10) 装箱后的前10个数据点: [[0. 0. 0. 0. 0. 0. 0. 0. 0. 1.] [0. 0. 0. 1. 0. 0. 0. 0. 0.0.] [0. 0. 0. 0. 0. 0. 1. 0. 0.0.] [0. 1. 0. 0. 0. 0. 0. 0. 0.0.] [0. 0. 0. 1. 0. 0. 0. 0. 0.0.] [0. 0. 0. 0. 0. 0. 0. 0. 1.0.] [0. 0. 1. 0. 0. 0. 0. 0. 0.0.] [0. 0. 0. 0. 1. 0. 0. 0. 0.0.] [0. 0. 0. 0. 0. 0. 0. 0. 1.0.] [0. 0. 0. 1. 0. 0. 0. 0. 0. 0.]]
仍旧50个变量,但是由于装进了10个箱子,特征数变为了10。下面我们再用装箱后的数据,独热编码进行MLPRegressor与KNeighborsRegressor拟合。
#使用独热编码进行数据表达 onehot_line =onehot.transform(np.digitize(line,bins=bins)) onehot_mlpr =MLPRegressor().fit(X_in_bin,y) onehot_knr =KNeighborsRegressor().fit(X_in_bin,y) plt.plot(line,onehot_mlpr.predict(onehot_line),label='New MLP') plt.plot(line,onehot_knr.predict(onehot_line),label='NewKNN') plt.plot(X,y,'o',c='g') plt.legend(loc='best') plt.show()
MLP与KNN拟合曲线保持一致,但是在每个箱子里面均为横直线,即斜率为0的直线。为了使斜率不为0,我们要进行数据升维。
注意:对于样本数据进行装箱处理,对于决策树为基础的算法,比如随机森林、梯度上升决策树、决策树是没有效果的。