在作为初级数据科学家的工作经历中,可以说当时在这个数据科学领域还是一个新手。有一次,一位客户来找,希望为他们的问题陈述实施机器学习,无论是无监督还是监督的形式。以为这将是一个常规的执行和处理过程,因为根据在小规模实施或培训期间的经验,通常有25-30个特征,会围绕这些特征进行操作,预测、分类或聚类数据集并分享结果。但这次他们带来了成千上万的特征,有点惊讶和害怕实施,头开始像任何事情一样旋转。与此同时,高级数据科学家把团队的每个人都带进了会议室。
高级数据科学家(Sr. DS)向介绍了一个新词,那就是“降维”(Dimensionality Reduction),或者说“维度的诅咒”(Curse Of Dimensionality)。所有新手都以为他要解释一些物理上的东西,有点记得在培训项目中遇到过这个术语。然后他开始在黑板上画图(参考图1)。当开始看1-D、2-D时,感到很舒服,但3-D及以上头开始旋转。
Sr. DS继续他的讲座,所有这些样本图片只是值得注意的特征,可以围绕这些特征进行操作,在实时场景中,许多机器学习(ML)问题涉及成千上万的特征,所以最终训练的模型变得极其缓慢,不会为商业问题提供好的解决方案,无法冻结模型,这种情况就是所谓的“维度的诅咒”。然后都开始问如何处理这个问题。
他深吸了一口气,继续以他自己的风格分享他的经验。他从简单的定义开始。什么是维度?可以说数据集中的特征数量被称为其维度。什么是降维?降维是减少给定数据集的维度(特征)的过程。假设数据集有一百列/特征,将列数减少到20-25。简单地说,就是将圆柱/球体转换为二维空间中的圆,或者将立方体转换为平面,如下所示。
他清楚地画出了模型性能和特征数量(维度)之间的关系。随着特征数量的增加,数据点的数量也成比例增加。直接的陈述是,更多的特征会带来更多的数据样本,所以代表了所有特征及其值的组合。
现在房间里的每个人都对“维度的诅咒”有了很高的感觉。降维的好处。突然,一个团队成员问是否可以告诉在给定数据集中进行降维的好处。Sr. DS没有停止分享他广泛的知识。他继续如下。如果进行降维,会有很多好处。它有助于去除特征中的冗余和噪声误差因素,最终增强给定数据集的可视化。由于降维,出色的内存管理活动得以展现。通过从数据集中移除不必要的特征列表来选择正确的特征,从而提高模型的性能。当然,较少的维度(必须的维度列表)需要较少的计算效率,并以提高的模型准确性更快地训练模型。显著降低整体模型及其性能的复杂性和过拟合。
是的!这是一个令人敬畏的景象,鲁棒性和动态的“降维”。现在可以可视化整体好处,如下所示。希望它也能帮助:)降维的好处。接下来,当然是!跳到下一个主要问题,降维技术有哪些。降维-技术。Sr. DS非常感兴趣,继续解释数据科学领域可能的技术,大致分为两类,如前所述,考虑选择最佳适应特征或移除给定高维数据集中较不重要的特征。这些高级技术通常被称为特征选择或特征提取,基本上是特征工程的一部分。他完美地连接了点。
在特征工程家族中定位降维。他带进一步深入概念,以理解应用于高维数据集的“降维”的大局。一旦看到下图,就能将特征工程和降维联系起来。看看这个图,Sr. DS在其中的降维的本质!每个人都对如何使用Python库应用所有这些感兴趣,Sr. DS让带来彩色标记和粉笔。
Sr. DS拿起新的蓝色标记,开始用一个简单的例子解释PCA,在此之前,他解释了PCA对降维是什么。主成分分析(PCA):PCA是一种降维技术,通过增加可解释性而不损失信息来减少给定数据集的变量。在这里,变量的数量在减少,所以它使进一步的分析更简单。它将一组相关的变量转换为一组不相关的变量。用于机器学习预测建模。他建议阅读特征向量、特征值。他熟悉wines.csv,用于他的快速分析。
# 导入所有必要的包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn import metrics
%matplotlib inline
import matplotlib.pyplot as plt
%matplotlib inline
wq_dataset = pd.read_csv('winequality.csv')
EDA on a given data set
wq_dataset.head(5)
wq_dataset.describe()
wq_dataset.isnull().any()
没有空值在给定的数据集中,所以很好,很幸运。
查找每个特征的相关性
correlations = wq_dataset.corr()['quality'].drop('quality')
print(correlations)
使用热图表示相关性
sns.heatmap(wq_dataset.corr())
plt.show()
x = wq_dataset[features]
y = wq_dataset['quality']
['fixed acidity', 'volatile acidity', 'citric acid', 'chlorides', 'total sulfur dioxide', 'density', 'sulphates', 'alcohol']
# 使用train_test_split创建训练和测试集
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=3)
训练和测试形状
print('Traning data shape:', x_train.shape)
print('Testing data shape:', x_test.shape)
Traning data shape: (1199, 8)
Testing data shape: (400, 8)
PCA implementation for Dimensionality reduction (with 2 columns)
from sklearn.decomposition import PCA
pca_wins = PCA(n_components=2)
principalComponents_wins = pca_wins.fit_transform(x)
将它们命名为
主成分 1, 主成分 2
pcs_wins_df = pd.DataFrame(data = principalComponents_wins, columns = ['principal component 1', 'principal component 2'])
新的
主成分及其值。
pcs_wins_df.head()
所有人都对上述两列新列名和值感到惊讶,问“固定酸度”、“挥发性酸度”、“柠檬酸”、“氯化物”、“总二氧化硫”、“密度”、“硫酸盐”、“酒精”列发生了什么。Sr. DS说都不见了,现在只有两列,因为对给定数据应用了PCA进行降维,将要实施一些模型,这将是正常方式。
print('Explained variation per principal component: {}'.format(pca_wins.explained_variance_ratio_))
Explained variation per principal component: [0.99615166 0.00278501]