日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) >

python升维方法_python机器学习12:数据“升维”

發(fā)布時(shí)間:2025/5/22 60 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python升维方法_python机器学习12:数据“升维” 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。