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