我們在實際應用中會遇到數據集特征不足的情況,要解決這個問題,就需要對數據集的特征進行擴充,
一般使用兩種方法:
- 交互式特征(Interaction Features)
- 多項式特征(Ploynomial Features)
1.准備數據集
#導入numpy import numpy as np #導入畫圖工具 import matplotlib.pyplot as plt #導入神經網絡 from sklearn.neural_network import MLPRegressor #生成隨機數列 rnd = np.random.RandomState(38) 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 #設置箱體數為11 bins = np.linspace(-5,5,11) #將數據進行裝箱操作 target_bin = np.digitize(X,bins=bins) #導入獨熱編碼 from sklearn.preprocessing import OneHotEncoder onehot = OneHotEncoder(sparse = False,categories='auto') onehot.fit(target_bin) #使用獨熱編碼轉化數據 X_in_bin = onehot.transform(target_bin) #生成一個等差數列 line = np.linspace(-5,5,1000,endpoint=False).reshape(-1,1) #使用獨熱編碼進行數據表達 new_line = onehot.transform(np.digitize(line,bins=bins))
2.向數據集中添加交互式特征
交互式特征是指在原始數據特征中添加交互項,使特征數量增加.
############################# 向數據集添加交互式特征 ####################################### #手工生成兩個數組 array_1 = [1,2,3,4,5] array_2 = [6,7,8,9,0] #使用hstack將兩個數組進行堆疊 array_3 = np.hstack((array_1,array_2)) #打印結果 print('將數組2添加到數據1中后得到:{}'.format(array_3))
將數組2添加到數據1中后得到:[1 2 3 4 5 6 7 8 9 0]
#將原始數據和裝箱后的數據進行堆疊 X_stack = np.hstack([X,X_in_bin]) print(X_stack.shape)
(50, 11)
#將數據進行堆疊 line_stack = np.hstack([line,new_line]) #重新訓練模型 mlpr_interact = MLPRegressor().fit(X_stack,y) #繪制圖形 plt.plot(line,mlpr_interact.predict(line_stack),label='MLP for interaction') plt.ylim(-4,4) for vline in bins: plt.plot([vline,vline],[-5,5],':',c='gray') plt.plot(X,y,'o',c='r') plt.legend(loc='lower right') #顯示圖形 plt.show()
#使用新的堆疊方式處理數據 X_multi = np.hstack([X_in_bin,X*X_in_bin]) #打印結果 print(X_multi.shape) print(X_multi[0])
(50, 20) [ 0. 0. 0. 1. 0. 0. 0. 0. 0. 0. -0. -0. -0. -1.1522688 -0. -0. -0. -0. -0. -0. ]
#重新訓練模型 mlpr_multi = MLPRegressor().fit(X_multi,y) line_multi = np.hstack([new_line,line * new_line]) #繪制圖形 plt.plot(line,mlpr_multi.predict(line_multi),label = 'MLP Regressor') for vline in bins: plt.plot([vline,vline],[-5,5],':',c='gray') plt.plot(X,y,'o',c='r') plt.legend(loc='lower right') #顯示圖形 plt.show()
3.向數據集中添加多項式特征
############################# 向數據集添加多項式特征 ####################################### #導入多項式特征工具 from sklearn.preprocessing import PolynomialFeatures #向數據集添加多項式特征 poly = PolynomialFeatures(degree=20,include_bias = False) X_poly = poly.fit_transform(X) #打印結果 print(X_poly.shape)
(50, 20)
#打印結果 print('原始數據集中的第一個樣本特征:\n{}'.format(X[0])) print('\n處理后的數據集中第一個樣本特征:\n{}'.format(X_poly[0])) #打印結果 print('PolynomialFeatures對原始數據的處理:\n{}'.format(poly.get_feature_names()))
原始數據集中的第一個樣本特征: [-1.1522688] 處理后的數據集中第一個樣本特征: [ -1.1522688 1.3277234 -1.52989425 1.76284942 -2.0312764 2.34057643 -2.6969732 3.10763809 -3.58083443 4.1260838 -4.75435765 5.47829801 -6.3124719 7.27366446 -8.38121665 9.65741449 -11.12793745 12.82237519 -14.77482293 17.02456756] PolynomialFeatures對原始數據的處理: ['x0', 'x0^2', 'x0^3', 'x0^4', 'x0^5', 'x0^6', 'x0^7', 'x0^8', 'x0^9', 'x0^10', 'x0^11', 'x0^12', 'x0^13', 'x0^14', 'x0^15', 'x0^16', 'x0^17', 'x0^18', 'x0^19', 'x0^20']
#導入線性回歸 from sklearn.linear_model import LinearRegression #使用處理后的數據訓練線性回歸模型 LNR_poly = LinearRegression().fit(X_poly,y) line_poly = poly.transform(line) #繪制圖形 plt.plot(line,LNR_poly.predict(line_poly),label='Linear Regressor') plt.xlim(np.min(X)-0.5,np.max(X)+0.5) plt.ylim(np.min(y)-0.5,np.max(y)+0.5) plt.plot(X,y,'o',c='r') plt.legend(loc='lower right') #顯示圖形 plt.show()
總結 :
線性模型在高維數據集中有良好的性能,但是在低維數據集中卻表現一般,因此我們需要用向數據集中添加交互式特征或多項式特征等方法來對數據集進行特征擴充,以便給數據集升維,從而提高線性模型的准確率.所以可以在一定程度上解決線性模型在低維數據出現欠擬合的問題,
文章引自 ; 《深入淺出python機器學習》