首页 微博热点正文

泰山,保藏!怎么运用特征提取技能下降数据集维度,喉咙

全文共5320字,估计学习时长2修真大中医0分钟

图源: https://blog.datasciencedojo.c

简介

现在,运用具有数百(乃至数千)个特征的数据集已然非常遍及了。假如这些特征数量与数据会集存储的调查值数量相差无几(或许前者比后者更多)的话,很或许会导致机器学习模型过度拟合。为防止此类问题的发作,需选用正则化或降维技术(特征提取)。在机器学习中,数据集的维数等于用来表明它的变量数。

运用正则化当然有助于下降过度拟合的危险,但运用特征提取技术也具有必定的优势,例如:

进步准确性

下降过度拟合危险

进步练习速度

进步数据可视化才能

进步模型可解说性

特征提取旨在经过在现有数据会集创立新特征(并抛弃原始特征)来削减数据会集的特征数量。这些新的简化特搜集需能够汇总原始特征会集的大部分信息。这样便能够从整合的原始特征会集创立原始特征的简化版别。

特征挑选也是一种常用的用来削减数据会集特征数量的技术。它与特征提取的差异在于:特征挑选旨在对数据会集现有特征的重要性进行排序,抛弃次重要的特征(不创立新特征)。

本文将以 Kaggle MushroomClassification Dataset为例介绍怎样运用特征提取技术。本文的方针是经过调查给定的特征来对蘑菇是否有毒进行猜测。

首要,需导入一切必需的数据库。

import time

import numpy as np

import pandas as pd

import matplotlib.pyplot as plt

from姚雄波 matplotlib.pyplot import figure

import seaborn as sns

from sklearn import preprocessing

from sklearn.preprocessing import LabelEncoder

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

from sklearn.metrics import classification_report,confusion_matr泰山,保藏!怎样运用特征提取技术下降数据集维度,嗓子ix

from sklearn.ensemble import RandomForestClassifier

extraction17.py hosted with ❤ by GitHub

下图为本例中将选用的数据集。

图1: 蘑菇分类数据集

将这些数据输入机器学习模型之前,将数据划分为特征(X)和标签(Y)以及独热码一切的分类变量。

X = df.drop(['class'], axis=1)

Y = df['class']

X = pd.get_dummies(X, prefix_sep='_')

Y = LabelEncoder().fit_transform(Y)

X = StandardScaler().fit_transform(X)

extraction15.py hosted with ❤ by GitHub

接着,创立一个函数(forest_test),将输入数据分红练习集和测验集,练习和测验一个随机森林分类器。

defforest_test(X, Y):

X_Train, X_Test, Y_Train, Y_Test = train_test_split(X, Y,

test_size=0.30,

random_state=101)

start = time.process_time()

trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Train,Y_Train)

print(time.process_time() - start)

predictionforest = trainedforest.predict(X_Test)

print(confusion_matrix(Y_Test,predictionforest))

print(classification_report(Y_Test,predictionforest))

extraction14.py hosted with ❤ by GitHub

现在能够首要将该函数泰山,保藏!怎样运用特征提取技术下降数据集维度,嗓子运用于整个数据集,然后再接连运用简化的数据集来比较二者的成果。

forest_test(X, Y)

extraction16.py hosted with ❤ by GitHub

如下图所示,运用这整个特搜集练习随机森林分类器,可在2.2秒左右的练习时刻内取得100%的准确率。鄙人列示例中,榜首行供给了练习时刻,供您参阅。

2.2676709799999992

[[1274 0]

[ 0 1164]]

precision recall f1-score support

0 1.00 1.00 1.00 1274

1 1.00 1.00 1.00 1164

accuracy 1.00 2438

macro avg 1.00 1.00 1.00 2438

weighted avg 1.00 1.00 1.00 2438

特征提取

主成分剖析 (PCA)

PCA是一项常用的线性降维技术。运用PCA时,将原始数据作为输入,并测验寻觅能够最好地归纳原始数据散布的输入特征的组合,然后下降原始数据的维数。它是经过调查pairwisedistances,来最大化方差和最小化重建差错。在PCA中,原始数据投影到一组正交轴上,而且每个轴上的数据都按重要程度排序。

PCA是一种无监督的学习算法,因而它不重视数据标签,只重视变量。这在某些状况下会导致数据分类过错。

在此例中,首要在整个数据会集运用PCA,将数据简化至二维,然后运用这些新数据特征及其标签构建一个数据帧。

from sklearn.decomposition importPCA

pca = PCA(n_components=2)

X_pca = pca.fit_transform(X)

PCA_df= pd.DataFrame(data= X_pca, columns= ['PC1', 'PC2'])

PCA_df= pd.concat([PCA_d猎巫收割者f, df['class']], axis=1)泰山,保藏!怎样运用特征提取技术下降数据集维度,嗓子

PCA_df['class'] = LabelEncoder().fit_transform(PCA_df['class'])

PCA_df.head()

extraction.py hosted with ❤ by GitHub

图2: PCA数据集

有了新创立的数据帧,现在能够在二维散点图中制作数据泰山,保藏!怎样运用特征提取技术下降数据集维度,嗓子散布图。

figure(num=None, figsize=(8, 8), dpi=80, facecolor='w', edgecolor='k')

classes = [1, 0]

colors = ['r', 'b']

for clas, color inzip(classes, colors):

plt.scatter(PCA_df.loc[PCA_df['class'] == clas, 'PC1'],

PCA_df.loc[PCA_df['class'] == clas, 'PC2'],

c= color)

plt.xlabel('Principal Component 1', fontsize=12)

plt.ylabel('Principal Component 2', fontsize=12)

plt.title('2D PCA', fontsize=15)

plt.legend(['Poisonous', 'Edible'])

plt.grid()

extraction2.py hosted with ❤ by GitHub

图3: 2维PCA可视化

现在能够重复这一过程,但将数据简化至三维,运用Plotly创立动画。

运用PCA还能够经过运用explained_variance_ratio_Scikit-learn函数来探求原始数据方差的保存程度。计算出方差比后就结构精巧的可视化图形了。

运用由PCA结构的三维特搜集(而不是整个数据集)再次运转随机森林分类器,分类准确率为98%,而运用二维的特搜集的分类准确率为95%。

pca = P泰山,保藏!怎样运用特征提取技术下降数据集维度,嗓子CA(n_components=3,svd_solver='full')

X_pca = pca.fit_transform(X)

print(pca.explained_variance_)

forest_test(X_pca, Y)

extraction9.py hosted with ❤ by GitHub

[10.31484926 9.42671062 8.35720548]

2.769664902999999

[[1261 13]

[ 41 1123]]

precision recall f1-score support

0 0.97 0.99 0.98 1274

1 0.99 0.96 0.98 1164

accuracy 0.98 2438

macro avg 0.98 0.98 0.98 2438

weighted avg 0.98 0.98 0.98 2438

此外,运用二维数据集,现在还能够对随机森林使所用的决议计划鸿沟进行可视化,以便对每个不同的数据点进行分类。

from itertools import product

X_Reduced, X_Test_Reduced, Y_Reduced, Y_Test_Reduced = train_test_split(X_pca, Y,

test_size=0.30,

random_state=恩耶马101)

trainedforest = RandomForestClassifier(n_estimators=700).fit(X_Reduced,Y_Reduced)

x_min, x_max = X_Reduced[:, 0].min() -1, X_Reduced[:, 0].max() +1

y_min, y_max = X_Reduced[:, 1].min() -1, X_Reduced[:, 1].max() +1

xx, yy = np.初中女生乳房meshgrid(np.arange(x_min, x_max, 0.1), np.arange(y_min, y_max, 0.1))

Z = trainedforest.predict(np.c_[xx.ravel(), yy.ravel()])

Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z,cmap=plt.cm.coolwarm, alpha=0.4)

plt.scatter(X_Reduced[:, 0], X_Reduc黄骅港气候ed[:, 1], c=Y_Reduced, s=20, edgecolor='k')

plt.xlabel('Principal Component 1', fontsize=12)

plt.ylabel('Principal Component 2', fontsize=12)

plt.title('Random Forest', fontsize=15)

plt.show()

extraction3.py hosted with ❤ by GitHub

图4: PCA随机森林决议计划鸿沟

独立成分剖析 (ICA)

ICA是一种线性降维办法,它以将独立成分混合作为输入数据,旨在正确辨认每个成分(删去一切不必要的噪声)。假如两个输入特征的线性相关和非线性相关都等于零[1],则能够以为它们是独立的。

ICA在医学中得到广泛运用,如脑电图和磁共振成像剖析等,它常用于区别有用信号和无用信号。

举一个ICA简略的运用案例:在做音频记载时,有两个人在攀谈。ICA能够区别出音频中两个不同的独立成分(即两种不同的声响)。这样,ICA就能够辨认出对话中不同的说话人。

现在,能够运用ICA再次将数据集简化为三维,利Wendesday用随机森林分类器来测验其准确性并在三维图中制作成果。

from sklearn.decomposition import FastICA

ica = FastICA(n_components=3)

X_ica = ica.fit_transform(X)

forest_test(X_ica, Y)

extraction5.py hosted with ❤ by GitHub

2.8933812039999793

[[1263 11]

[ 44 1120]]

precision recall f1-score support

0 0.97 0.99 0.98 1274

1 0.99 0.96 0.98 1164

accuracy 0.98 2438

macro avg 0.98 0.超级特警归纳体系98 0.98 2438

weighted avg 0.98 0.98 0.98 2438

从下面的动画中能够发现,虽然PCA和ICA的准确度相同,可是它们结构出的三维空间散布图却不同。

线性判别式剖析(LDA)

LDA是有监督的学习降维技术和机器学习分类器。

LDA旨在最大化类间间隔,并最小化类内间隔。因而,LDA将类内间隔和类间间隔作为衡量标准。在低维空间投影数据,能最大化类间间隔,然后能够得出更好的分类成果(不同类之间的堆叠削减),因而,LDA是上乘之选。

运用LDA时,应假定输入数据遵从高斯散布(如本例),因而将LDA运用于非高斯数据或许会导致过错的分类成果。

本例将运转LDA将数据集简化为一维,测验其准确性并制作成果。

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

lda = LinearDiscriminantAnalysis(n_components=1)

# run an LDA an王若林d use it to transform the features

X_lda = lda.fit(X, Y).transform(X)

print('Original number of features:', X.shape[1])

print('Reduced number of features:', X_lda.shape[1])

extraction11.py hosted with ❤ by GitHub

Original number of features: 117

Reduced number of features: 1

因为本例遵从高斯散布,所以LDA得到了非常好的成果,运用随机森林分类器测验,精确度到达100%。

forest_test(X_lda, Y)

extraction12.py hosted with ❤ by GitHub

1.2756952610000099

[[1274 0]

[ 0 1164]]

precision recall f1-score support

0 1.00 1.00 1.00 1274

1 1.00 1.00 1.00 1164

accuracy 1.00 2438

macro avg 1.00 1.00 1.00 2438

weighted avg 1.00 1.00 1.00 2438

X_Reduced, X_Test_Reduced, Y_Reduced, Y_Test_Reduced = train_test_split(X_lda, Y,

test_size=0.30,

random_state=101)穆天宇

start = time.process_time()

lda = LinearDiscriminantAnalysis().fit(X_Reduced,Y_Reduced)

print(time.process_time() - start)

predictionlda = lda.predict(X_Test_Reduced)

print(confusion_matrix(Y_Test_Reduced,predictionlda))

print(classification_report(Y_Test_Reduced,predictionlda))

extraction13.py hosted with ❤ by GitHub

0.008464782999993758

[[1274 0]

[ 2 1162]]

precision recall f1-score support

0 1.00 1.00 1.00 1274

1 1.00 1.00 1.00 1164

accuracy 1.00 2438

macro avg 1.00 1.00 1.00 2438

weighted avg 1.00 1.00 1.00 2438

最终,能够直观地看到两个类的散布是怎样看起来像创立一维数据散布图的。

图5: LDA类别离

部分线性嵌入 (LLE)

本文现已评论了PCA和LDA等办法,它们能够针对不同特征间的线性关系很好地运转,下面将评论怎样处理非线性状况。

LLE是一种依据流形学习的降维技术天火鹰弓。流形数据指嵌入高维空间中的D维目标。流形学习旨在使该目标在开始的D维中表现出来,而不是在不必要的更大空间中表现出来。

机器学习中用于解说流形学习的典型比如就是Swiss Roll Manifold(图6)。咱们得到一些数据作为输入,这些数据的散布相似于一个卷(在三维空间中),然后将其打开,然后将数据紧缩进二维空间。

流形学习算法有:Isomap、LLE、ModifiedLocally Linear Embedding, Hessian Eigenmapping等。

图6: 流形学习 [2]

现将带你了解怎样在本例中运用LLE。依据Scikit-learn文档显现[3]:

LLE在部分邻域内寻求存在间隔的数据的低维投影。它能够看作是一系列PCA,经过进行大局比较来寻觅最佳的非线性嵌入。

现能够在数据集上运转LLE,将数据降到3维,测验准确度并制作成果。

from sklearn.manifold import LocallyLinearEmbedding

embedding = LocallyLinearEmbedding(n_components=3)

X_lle = embedding.fit_transform(X)

forest_test(X_lle, Y)

extraction6.py hosted with ❤ by GitHub

2.578125

[[1273 0]

[1143 22]]

precision recall f1-score support

0 0.53 1.00 0.69 1273

1 1.00 0.02 0.04 1165

micro告知首脑我现已极力 avg 0.53 0.53 0.53 2438泰山,保藏!怎样运用特征提取技术下降数据集维度,嗓子

macro avg 0.76 0.51 0.36 2438

weighted avg 0.75 0.53 0.38 2438

t-散布随机邻域嵌入(t-SNE)

t-SNE是一种典型的用于高维数据可视化的非线性降维技术。它的首要运用是自然语言处理(NLP)、语音处理等。

t-SNE经过最小化由原始高维空间中输入特征的成对概率相似性构成的散布和其在减缩的低维空间中的等效散布之间的差异来作业。它运用 Kullback-Leiber (KL)散度来衡量两种不同散布的差异性。然后运用梯度下降将KL散度最小化。

运用t-SNE时,高维空间运用高斯散布建模,而低维空间运用学生t散布建模。这样做是为了防止因为转化到低维空间而导致相邻点间隔散布不平衡的问题。

现已预备运用t-SNE,并将数据集降至到3维。

from sklearn.manifold importTSNE

start = time.process_time()

tsne = TSNE(n男生丁丁_components=五华县横陂中学3, verbose=1, perplexity=40, n_iter=300)

X_tsne = tsne.fit_transform(X)

print(time.process_time() - start)

extraction4.py hosted with ❤ by GitHub

[t-SNE] Computing 121 nearestneighbors...

[t-SNE] Indexed 8124 samples in 0.139s...

[t-SNE] Computed neighbors for 8124 samples in 11.891s...

[t-SNE] Computed conditional probabilities for sample

1000 / 8124

[t-SNE] Computed conditional probabilities for sample

2000 / 8124

[t-SNE] Computed conditional probabilities for sample

3000 / 8124

[t-SNE] Computed conditional probabilities for sample

4000 / 8124

[t-SNE] Computed conditional probabilities for sample

5000 / 8124

[t-SNE] Computed conditional probabilities for sample

6000 / 8124

[t-SNE] Computed conditional probabilities for sample

7000 / 8124

[t-SNE] Computed conditional probabilities for sample

8000 / 8124

[t-SNE] Computed conditional probabilities for sample

8124 / 8124

[t-SNE] Mean sigma: 2.658530

[t-SNE] KL divergence after 250 iterations with early

exaggeration: 65.601128

[t-SNE] KL divergence after 300 iterations: 1.909915

143.984375

可视化成果特征的散布清楚地显现了即便数据在一个缩小的空间进行转化,也能很好地别离。

运用t-SNE降维子集测验随机森林的准六指鬼医确度,然后证明分类能够很容易地别离。

forest_test(X_tsne, Y)

extraction10.py hosted with ❤ by GitHub

2.6462027340000134

[[1274 0]

[ 0 1164]]

precision recall f1-score support

0 1.00 1.00 1.00 1274

1 1.00 1.00 1.00 1164

accuracy 1.00 2438

macro avg 1.00 1.00 1.00 2438

weighted avg 1.00 1.00 1.00 2438

主动编码器

主动编码器指一类可用作降维技术的机器学习算法。它与其他降维技术的首要差异在邓亚萍怎样点评何智丽于:主动编码器运用的对错线性转化,将数据从高维投影到低维。

主动编码器有以下几种不同类型,如:

•去噪主动tarjiman编码器

•变分主动编码器

•卷积主动编码器

•稀少主动编码器

本例将首要构建一个根本的主动编码器(图7)。主动编码器的根本结构可分为两个首要部分:

1.编码巫向前器:将输入的数据进行紧缩,然后移除一切或许的噪声和无用信息。编码器的输出一般称为瓶颈或潜在空间。

2.解码器:将编码后的潜在空间作为输入,并测验仅运用其紧缩方式(编码后的潜在空间)再现原始的主动编码器输入。

假如一切的输入特征都是彼此独立的,那么主动编码器将很难对在低维空间中输入的数据进行编码和解码。

图7: 主动编码器结构[4]

主动编码器能够运用Keras API在python中运用。本例在编码层中指定要将输入数据削减到必定的特征数(例3)。从下面的代码片段中能够看到,主动编码器将X(输入特征)作为特征和标签(X,Y)。

在此比如中,本文决议运用ReLu作为编码阶段的激活函数,运用Softmax作为解码阶段的激活函数。如不运用非线性激活函数,那么主动编码器就会测验运用线性变换来给输入数据降维(因而会得到一个与运用PCA相似的成果)。

from keras.layers import Input, Dense

from keras.models import Model

input_layer = Input(shape=(X.shape[1],))

encoded = Dense(3, activation='relu')(input_layer)

decode苏洪曲d = Dense(X.shape[1], activation='softmax')(encoded)

autoencoder = Model(input_layer, decoded)

autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

X1, X2, Y1, Y2 = train_test_split(X, X, test_size=0.3, random_state=101)

autoencoder.fit(X1, Y1,

epochs=100,

batch_size=300,

shuffle=True,

verbose=30,

va泰山,保藏!怎样运用特征提取技术下降数据集维度,嗓子lidation_data=(X2, Y2))

encoder = Model(input_layer, encoded)

X_ae = encoder.predict(X)

extraction7.py hosted with ❤ by GitHub

现可重复前例相似过程,这次运用一个简略的主动编码器作为特征提取。

forest_test(X_ae, Y)

extraction8.py hosted with ❤ by GitHub

1.734375

[[1238 36]

[ 67 1097]]

precision recall f1-score support

0 0.95 0.97 0.96 1274

1 0.97 0.94 0.96 1164

micro avg 0.96 0.96 0.96 2438

macro avg 0.96 0.96 0.96 2438

weighted avg 0.96 0.96 0.96 2438

期望你有所收成!感谢阅览!

留言点赞重视

咱们一同共享AI学习与开展的干货

如转载,请后台留言,恪守转载标准

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。