- 一、什么是线性判别分析?
- 二、线性判别分析原理
- 三、LDA优缺点
- 四、案例实现
- 4.1 数据集介绍
- 4.2 案例实现
逻辑回归是一种传统上仅限于两个分类的分类问题分类算法。如果你有两个以上的类,则线性判别分析算法是首选的线性分类技术,因此该算法有效的补充了逻辑回归的缺点。它用于对组中的差异进行建模,即分离两个或多个类,它将高维空间中的特征投影到低维空间中。
线性判别分析是机器学习中用于监督分类问题的最流行的降维技术之一。
二、线性判别分析原理线性判别分析被用作机器学习中的一种降维技术,使用它我们可以轻松地将 2-D 和 3-D 图转换为一维平面。
让我们考虑一个示例,其中我们在具有 XY 轴的二维平面中有两个类,我们需要对它们进行有效分类。LDA 使我们能够绘制一条可以完全分离两类数据点的直线。在这里,LDA 使用 XY 轴通过使用直线将它们分开并将数据投影到新轴上来创建新轴。
因此,我们可以最大化这些类之间的分离并将二维平面减少为一维: 要创建新轴,线性判别分析使用以下标准:
- 最大化两个类的平均值之间的距离。
- 最小化每个类中的变化。
使用上述两个条件,LDA 生成一个新轴,它可以最大化两个类的均值之间的距离并最小化每个类内的变化。换句话说,我们可以说新轴将增加两个类的数据点之间的分离,并将它们绘制到新轴上。
优点:
- Logistic 回归是最流行的分类算法之一,它在二元分类中表现良好,但在具有良好分离的类的多个分类问题的情况下表现不佳。然而,LDA 可以非常有效地处理这些问题。
- 降维:LDA 也可以用于数据预处理,以减少特征的数量,就像 PCA 一样降维,显着降低了计算成本。
- 人脸识别:LDA 也用于人脸检测算法。在 Fisherfaces 中,LDA 用于从不同的人脸中提取有用的数据。再加上特征脸,它会产生有效的结果。
- 客户识别:假设我们要识别最有可能在购物中心购买特定产品的客户类型。通过做一个简单的问答调查,我们可以收集客户的所有特征。在这里,线性判别分析将帮助我们识别和选择可以描述最有可能在购物中心购买特定产品的客户群特征的特征。
- 在该领域,线性判别分析 (LDA) 用于根据患者的各种参数和他正在接受的医疗将患者的疾病状态分类为轻度、中度或重度。这有助于医生加强或降低治疗速度。
缺点: LDA 专门用于解决两个或更多类的监督分类问题,这在机器学习中使用逻辑回归是不可能的。但是 LDA 在某些分布均值被共享的情况下也会失败。在这种情况下,LDA 无法创建使两个类线性可分的新轴,这里就需要使用新的方法:非线性判别分析。
四、案例实现 4.1 数据集介绍Iris 数据集包括三个鸢尾品种,每个品种有 50 个样本,以及每朵花的一些特性。一种花种与另外两种是线性可分的,但另外两种不是彼此线性可分的。
该数据集中的列是:
- ID
- 萼片长度厘米
- 萼片宽度厘米
- 花瓣长度厘米
- 花瓣宽厘米
- 物种
第一步:读取数据
import pandas as pd
data=pd.read_csv('Iris.csv')
data
如下: 第二步:提取自变量与因变量
X = data.drop('Species',axis=1)
y = data['Species']
X
如下: 第三步:提取自变量与因变量。因变量为字符,需要编码;自变量不同特征需要做缩放(效果会好点)。
from sklearn.preprocessing import StandardScaler, LabelEncoder
sc = StandardScaler() #
X = sc.fit_transform(X)
le = LabelEncoder() # 对目标标签进行编码。因为它们为字符。(也可以用onehot编码)
y = le.fit_transform(y)
y # 查看下编码结果
如下: 第四步:分割训练集和测试集。8:2的比例进行分割。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
第五步:建立模型。n_components参数理解为轴数量。
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis # 导入线性判别分析
# n_components用于降维的组件数,理解成轴的数量。如果没有,将设置为 min(n_classes - 1, n_features)。这里就是min(3-1,5)=2
lda = LinearDiscriminantAnalysis(n_components=2)
lda
如下: 第六步:数据拟合与转换。fit_transform()方法基本上是fit方法和transform方法的结合,相当于fit().transform()。该方法一次对输入数据执行拟合和变换,并转换数据点。 如果我们在需要时分别使用 fit 和 transform ,那么它会降低模型的效率,所以我们使用 fit_transform() 来完成这两项工作。
X_train = lda.fit_transform(X_train, y_train) #拟合训练并转换
X_test = lda.transform(X_test) # 转换测试数据
X_test
如下: 第七步:可视化三个类别。
import matplotlib.pyplot as plt
#alpha介于 0(透明)和 1(不透明)之间。
# edgecolors标记的边缘颜色
# c指定数组为y_train
plt.scatter(
X_train[:,0],X_train[:,1],c=y_train,alpha=0.7,edgecolors='b'
)
如下: 第八步:在前面是已经做玩LDA分析了,成功分出三个类别,现在我们建立一个随机森林算法模型来对他们训练分类。
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(max_depth=2, random_state=0)
classifier.fit(X_train, y_train)
y_pred = classifier.predict(X_test)
第九步:评估模型。
from sklearn.metrics import accuracy_score, confusion_matrix #导入准确度和混合矩阵
print('Accuracy : ' + str(accuracy_score(y_test, y_pred))) # 准确度
conf_m = confusion_matrix(y_test, y_pred) # 得到混合矩阵
print(conf_m)
如下:
Accuracy : 1.0
[[ 9 0 0]
[ 0 10 0]
[ 0 0 11]]
如果混淆矩阵还看不懂,可以对比这个图:
第十步:可视化混淆矩阵。
from sklearn.metrics import plot_confusion_matrix
plot_confusion_matrix(classifier, X_test, y_test)
plt.show()
如下: 根据混淆矩阵可以看出,没有出现一点的错误,全部预测准确,与计算出来的准确率相符,说明模型对该数据很好。