python升维方法_python机器学习12:数据“升维”
1.向數據集添加交互式特征
在實際應用中,常常會遇到數據集的特征不足的情況,要解決這個問題,就需要對數據集的特征進行擴充。這里我們介紹兩種在統計建模中常用的方法---交互式特征(Interaction Features)和多項式特征(Polynomial Features)。現在這兩種方法在機器學習領域也非常普遍。
1.交互式特征的定義:
顧名思義,交互式特征是在原始數據特征添加交互項,使特征數量增加。
在python中,我們可以通過Numpy的hstack函數來對數據集添加交互項,下面我們先通過一段代碼了解一下hstack函數的原理,輸入代碼如下:
array_1 = [1,2,3,4,5]
array_2 = [6,7,8,9,0]
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]
結果分析:從結果中看到,原來兩個5維數組被堆疊到一起,形成了一個新的10維數組,也就是說我們使array_1和array_2產生了交互。假如array_1和array_2分別代表兩個數據點的特征,那么我們生成的array_3就是他們的交互特征。
接下來我們繼續用之前生成的數據集來進行實驗,看對特征進行交互式操作會對模型產生什么樣的影響,輸入代碼如下:
X_stack = np.hstack([X, X_in_bin])
X_stack.shape
運行代碼,得到如下結果:
(50, 11)
從結果可以看到,X_stack的數量仍然是50個,而特征數量變成了11.下面我們要用新的特征X_stack來訓練模型,輸入代碼如下:
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='k')
plt.legend(loc='lower right')
plt.plot(X, y,'o',c='r')
plt.show()
運行代碼,如下圖所示:
每個箱子中斜率相同的MLP神經網絡模型
結果分析:
首先拿出上一節的經過裝箱的數據擬合的模型的圖形來和這一次擬合經過特征交互的數據的模型圖進行比較:
圖片.png
發現上個圖的模型的斜率是水平的,這一次的模型斜率是傾斜的。也就是說,在添加了交互式特征之后,在每個數據所在的裝箱體中,MLP模型增加了斜率,復雜度有所提高。
但是,發現每個箱體中模型的斜率都是一樣的,這還不是我們想要的結果,我們希望達到的效果是,每個箱體中都有各自的截距和斜率。所以要換一種數據處理的方式,輸入一下代碼:
#使用心得堆疊方式處理數據
X_multi = np.hstack([X_in_bin, X*X_in_bin])
print(X_multi.shape)
print(X_multi[0])
運行代碼,結果如下:
新的數據形態和第一個數據點的特征
結果分析:從結果中可以看到,經過以上的處理,心得數據集特征X_mulit變成了有20個特征值的形態。試著打印出第一個樣本,發現20個特征中大部分數值都是0,而在之前的X_in_bin中數值為1的特征,與原始數據中X的第一個特征值-1.522688保留了下來。
下面用處理過的數據集訓練神經網絡,看看模型會有什么不同,輸入代碼如下:
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()
運行代碼,得到如下圖所示的結果:
每個箱子中斜率不同的神經網絡模型
結果分析:每個箱子中模型的截距和斜率都不一樣了。而這種數據處理的目的,主要是為了讓比較容易出現欠擬合現象的模型能有更好的表現。
例如:線性模型在高維數據集中有良好的表現,但是在低維數據集中表現卻一般,因此需要用上面的方法來進行特征擴充,以便給數據集“升維”,從而提高線性模型的準確率。
2.向數據集添加多項式特征
首先回顧一下什么是多項式,在數學中,多項式指的是多個單項式相加所組成的代數式。當然如果是減號的話,可以看作是這個單項式的相反數。下面是一個典型的多項式:
而其中的
和e都是單項式。在機器學習當中,常用的擴展樣本特征的方式就是將特征X進行乘方,如
等。你可能覺得這有點兒麻煩,不過沒有關系,scikit-learn中內置了一個功能,稱為PolynomialFeatures,使用這個功能就可以輕松地將原始數據及的特征進行擴展,下面來看代碼:
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=20, include_bias = False)
X_poly = poly.fit_transform(X)
print (X_poly.shape)
這段代碼中,首先指定了PolynomialFeatures的degree參數為20,這樣可以生成20個特征,include_bias設定為False,如果為True,PolynomialFeatures只會為數據集添加數值為1的特征
運行代碼,如下:
(50, 20)
結果分析:
從結果中可以看到,仍然是50個樣本,但每個樣本的特征數變成了20個。
那么PolynomialFeatures對數據進行了怎樣的調整呢?我們用下面的代碼打印一個樣本的特征看一下:
print('原始數據集中的第一個樣本特征:\n{}'.format(X[0]))
print('\n處理后的數據集中第一個樣本特征:\n{}'.format(X_poly[0]))
運行代碼,得到如下圖所示結果:
經過多項式特征添加前后的樣本特征對比
結果分析:從結果可看到,原始數據及的樣本只有一個特征,而處理后的數據集有20個特征。如果你口算能力很強的話,大概可以看出樣本的第一個特征是原始特征,第二個特征是原始特征的2次方,第三個特征是原始特征的3次方,以此類推。
下面我們用線性模型回歸來實驗一下這樣處理的數據集,輸入代碼如下:
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()
運行代碼,得到如下圖:
對經過PolynomialFeatures處理的數據進行線性回歸
結果分析:從圖中可以看出,這條線變得分外妖嬈,從而得出結論:對于低維數據集,線性模型常常出現欠擬合的問題,而將數據集進行多項式特征擴展后,可以在一定程度上解決線性模型欠擬合的問題。
總結
以上是生活随笔為你收集整理的python升维方法_python机器学习12:数据“升维”的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python相比c语言更动态_Pytho
- 下一篇: oracle 一个实例创建多个数据库_o