目录
wine葡萄酒数据集分析报告
一、问题阐述
1.1、数据集信息
wine样本数据集中是double类型的178 * 14矩阵包括了三种酒中13种不同成分的数量。文件中,每行代表一种酒的样本,共有178个样本,一共有14列,其中,第一个属性是类标识符,分别是1/2/3来表示,代表葡萄酒的三个分类。后面的13列为每个样本的对应属性的样本值。剩余的13个属性是,酒精、苹果酸、灰、灰分的碱度、镁、总酚、黄酮类化合物、非黄烷类酚类、原花色素、颜色强度、色调、稀释葡萄酒的OD280/OD315、脯氨酸。其中第1类有59个样本,第2类有71个样本,第3类有48个样本。具体属性描述如下:
1.2、可解决的问题
这是一个多类分类问题,但也可以被定义为回归问题。它的分类数据是不均衡的(例如,正常葡萄酒的数量比优质或差的葡萄酒多得多),很适合针对不均衡数据集的分类练习。除此之外,数据集中所有特征并不都是相关的,因此也可以拿来练习特征工程和特征选择。
二、设计目的
wine数据集,是红酒数据集,可以用来测试分类算法的性能。该数据集为意大利同一地区生产的三个不同种类的葡萄酒的成分数据,对其178条数据进行分析处理,其*有13个成分特征.为了解决人工评审葡萄酒分类时容易产生错误的问题,提高分类效率,采用机器学习中支持向量机,逻辑回归等方法对其特征进行分析来确定葡萄酒的分类。
三、实验需要的平台
本项目用的python作为开发语言,pycharm作为开发工具,免费软件机器学习库sklearn,Python 2D绘图库Matplotlib。sklearn它具有各种分类,回归和聚类算法,包括支持向量机,随机森林,梯度提升,k均值和DBSCAN,并且旨在与Python数值科学库NumPy和SciPy联合使用。Matplotlib它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。
四、基本原理分析
4.1、逻辑回归算法基本原理
逻辑回归是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏。逻辑回归的原理是用逻辑函数把线性回归的结果(-∞,∞)映射到(0,1),回归模型中,y是一个定性变量,比如y=0或1,logistic方法主要应用于研究某些事件发生的概率。
4.2、支持向量机算法的基本原理
支持向量机(Support Vector Machine,常简称为SVM)是一种监督式学习的方法,可广泛地应用于统计分类以及回归分析。它是将向量映射到一个更高维的空间里,在这个空间里建立有一个最大间隔超平面。在分开数据的超平面的两边建有两个互相平行的超平面,分隔超平面使两个平行超平面的距离最大化。假定平行超平面间的距离或差距越大,分类器的总误差越小。
SVM的核心思想可以概括为两点:
(1)它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。
(2)它基于结构风险最小化理论之上再特征空间中构建最优超平面,使得学习器得到全局最优化,并且在整个样本空间的期望以某个概率满足一定上界。
五、实验过程阐述及实验结论
5.1、实现逻辑回归算法过程及结论
x_train,y_train,x_test,y_test = data_train,target_train,data_test,target_test |
将数据集划分为测试集和训练集,运用逻辑回归算法函数训练训练集得到clf训练模型,再根据clf模型去预测测试集,根据预测结果来查看该模型的训练是否成功
5.2、实现支持向量机算法过程及结论
svm = SVC().fit(data_std_train,target_train)#建立svc模型 |
加载数据,将数据集分为训练集和测试集,运用支持向量机算法训练训练集得到svm训练模型,再根据svm模型去预测测试集,根据预测结果来查看该模型的训练是否成功
六、分析支持向量机算法和逻辑回归算法的异同及优缺点
6.1、逻辑回归算法与支持向量机算法的异同点
相同点:
1、都是分类算法,本质上都是在找最佳分类超平面;
2、都是监督学习算法;
3、都是判别式模型,判别模型不关心数据是怎么生成的,它只关心数据之间的差别,然后
4、用差别来简单对给定的一个数据进行分类;
5、都可以增加不同的正则项。
不同点:
1、LR 是一个统计的方法,SVM 是一个几何的方法;
2、SVM 的处理方法是只考虑 Support Vectors,也就是和分类最相关的少数点去学习分类器。而逻辑回归通过非线性映射减小了离分类平面较远的点的权重,相对提升了与分类最相关的数据点的权重;
3、损失函数不同:LR 的损失函数是交叉熵,SVM 的损失函数是 HingeLoss,这两个损失函数的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。对 HingeLoss 来说,其零区域对应的正是非支持向量的普通样本,从而所有的普通样本都不参与最终超平面的决定,这是支持向量机最大的优势所在,对训练样本数目的依赖大减少,而且提高了训练效率;
4、LR 是参数模型,SVM 是非参数模型,参数模型的前提是假设数据服从某一分布,该分布由一些参数确定(比如正太分布由均值和方差确定),在此基础上构建的模型称为参数模型;非参数模型对于总体的分布不做任何假设,只是知道总体是一个随机变量,其分布是存在的(分布中也可能存在参数),但是无法知道其分布的形式,更不知道分布的相关参数,只有在给定一些样本的条件下,能够依据非参数统计的方法进行推断。所以 LR 受数据分布影响,尤其是样本不均衡时影响很大,需要先做平衡,而 SVM 不直接依赖于分布;
5、LR 可以产生概率,SVM 不能;
6、LR 不依赖样本之间的距离,SVM 是基于距离的;
7、LR 相对来说模型更简单好理解,特别是大规模线性分类时并行计算比较方便。而 SVM 的理解和优化相对来说复杂一些,SVM 转化为对偶问题后,分类只需要计算与少数几个支持向量的距离,这个在进行复杂核函数计算时优势很明显,能够大大简化模型和计算
6.2、逻辑回归算法的优缺点
算法优点:
(1)对率函数任意阶可导,具有很好的数学性质,许多现有的数值优化算法都可以用来求最优解,训练速度快;
(2)简单易理解,模型的可解释性非常好,从特征的权重可以看到不同的特征对最后结果的影响;
(3)适合二分类问题,不需要缩放输入特征;
(4)内存资源占用小,因为只需要存储各个维度的特征值;
(5)直接对分类可能性进行建模,无需事先假设数据分布,避免了假设分布不准确所带来的问题
(6)以概率的形式输出,而非知识0.1判定,对许多利用概率辅助决策的任务很有用
算法缺点:
(1)不能用逻辑回归去解决非线性问题,因为Logistic的决策面试线性的;
(2)对多重共线性数据较为敏感;
(3)很难处理数据不平衡的问题;
(4)准确率并不是很高,因为形式非常的简单(非常类似线性模型),很难去拟合数据的真实分布;
(5)逻辑回归本身无法筛选特征,有时会用gbdt来筛选特征,然后再上逻辑回归。
6.3、支持向量机算法优缺点
算法优点:
(1)使用核函数可以向高维空间进行映射
(2)使用核函数可以解决非线性的分类
(3)分类思想很简单,就是将样本与决策面的间隔最大化
(4)分类效果较好
算法缺点:
(1)SVM算法对大规模训练样本难以实施
(2)用SVM解决多分类问题存在困难
(3)对缺失数据敏感,对参数和核函数的选择敏感
七、结论
7.1、逻辑回归算法结果
7.2、支持向量机算法结果
7.3、kmeans算法结果
八、附加
8.1、Kmeans算法的基本原理
K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
假设要把样本集分为k个类别,算法描述如下:
(1)适当选择k个类的初始中心,最初一般为随机选取;
(2)在每次迭代中,对任意一个样本,分别求其到k个中心的欧式距离,将该样本归到距离最短的中心所在的类;
(3)利用均值方法更新该k个类的中心的值;
(4)对于所有的k个聚类中心,重复(2)(3),类的中心值的移动距离满足一定条件时,则迭代结束,完成分类。
Kmeans聚类算法原理简单,效果也依赖于k值和类中初始点的选择。
8.2、Kmeans算法的优缺点
算法优点:
(1)原理简单,收敛速度快,这个是业界用它最多的重要原因之一。
(2)调参的时候只需要改变k一个参数。
(3)算法的原理简单,可解释性好
算法缺点:
(1)对于离群点和噪音点敏感。例如在距离中心很远的地方手动加一个噪音点,那么中心的位置就会被拉跑偏很远。
(2)k值的选择很难确定。
(3)只能发现球状的簇。在k-means中,我们用单个点对cluster进行建模,这实际上假设了各个cluster的数据是呈高维球型分布的,但是在生活中出现这种情况的概率并不算高。例如,每一个cluster是一个一个的长条状的,k-means的则根本识别不出来这种类别(这种情况可以用GMM)。实际上,k-means是在做凸优化,因此处理不了非凸的分布。
(4)如果两个类别距离比较近,k-means的效果也不会太好。
(5)初始值对结果影响较大,可能每次聚类结果都不一样。
(6)结果可能只是局部最优而不是全局最优。
九、代码
from sklearn.cluster import KMeans#K-Means聚类模型
from sklearn.datasets import load_wine#wine数据集
import numpy as np
import matplotlib.pyplot as plt#数据可视化
from sklearn.decomposition import PCA#pca降维
from sklearn.linear_model import LinearRegression#线性回归模型
from sklearn.metrics import fowlkes_mallows_score, silhouette_score, classification_report, mean_absolute_error, \
mean_squared_error, median_absolute_error, explained_variance_score, r2_score
from sklearn.model_selection import train_test_split#数据集划分
from sklearn.preprocessing import StandardScaler#标准差标准化
from sklearn.svm import SVC#SVM分类模型
#导入数据集
wine = load_wine()
data = wine['data']
target = wine['target']
print("data:")
print(data)
print("target")
print(target)
#数据集划分为训练集,测试集
data_train,data_test,target_train,target_test = train_test_split(data,target,test_size=0.2,random_state=125)
#标准差标准化(规则)
stdScaler = StandardScaler().fit(data_train)#stdScaler存有计算出来的均值和方差
data_std_train = stdScaler.transform(data_train)#使用stdScaler中的均值和方差使得data_train归一化
data_std_test = stdScaler.transform(data_test)
#pca降维
pca_model = PCA(n_components=10).fit(data_std_train)#规则
data_pca_train = pca_model.transform(data_std_train)
data_pca_test = pca_model.transform(data_std_test)
print(data_pca_test)
#聚类模型
kmeans = KMeans(n_clusters=3,random_state=42).fit(data)
print('聚类模型为:',kmeans)
#聚类评分
#方法1FMI评分:
s = []
for i in range(2,11):
kmeans1 = KMeans(n_clusters=i,random_state=42).fit(data)
score1 = fowlkes_mallows_score(target,kmeans1.labels_)
print('FMI第%d类,评分为:%f'%(i,score1))
s.append(score1)
print('FMI最优评分为:%f'%np.max(s))
#方法2轮廓系数评分:
sil_score = []
for j in range(2,15):
kmeans2 = KMeans(n_clusters=j, random_state=42).fit(data)
score2=silhouette_score(data,kmeans2.labels_)
sil_score.append(score2)
plt.rcParams['font.sans-serif'] = 'simhei'
plt.rcParams['axes.unicode_minus'] = False
plt.figure(figsize=(10,6))
plt.title('轮廓系数评分折线图')
plt.plot(range(2,15),sil_score,linewidth=1.5,linestyle='-',c='red')
plt.xticks(range(2,15,1))
plt.show()
# svm分类及预测
svm = SVC().fit(data_std_train,target_train)#建立svc模型
target_pred = svm.predict(data_std_test)#结果预测
true = np.sum(target_pred == target_test)
accuracy=true/target_test.shape[0]
print("svm算法:")
print('预测正确结果:',true)
print('预测错误结果:',target_test.shape[0]-true)
print('正确率:',accuracy)
#评价报告
print('svm分类结果报告为:','\n',classification_report(target_test,target_pred))
#逻辑回归
x_train,y_train,x_test,y_test = data_train,target_train,data_test,target_test
clf = LinearRegression().fit(x_train,y_train)
y_pred = clf.predict(x_test)
print("逻辑回归算法:")
print('预测:',y_pred)
#回归结果可视化
plt.figure(figsize=(10,7))
plt.plot(range(y_test.shape[0]),y_test,linewidth=1.7,linestyle='-')
plt.plot(range(y_test.shape[0]),y_pred,linewidth=1.5,linestyle='-.')
plt.legend(['true_calue','predicted_value'])
plt.show()
#评价回归模型
print('Boston数据线性回归模型的平均绝对误差为:',mean_absolute_error(y_test,y_pred))
print('Boston数据线性回归模型的均方差为:',mean_squared_error(y_test,y_pred))
print('Boston数据线性回归模型的中值绝对误差为:',median_absolute_error(y_test,y_pred))
print('Boston数据线性回归模型的可解释方差值为:',explained_variance_score(y_test,y_pred))
print('Boston数据线性回归模型的R^2为:',r2_score(y_test,y_pred))
本文代码借鉴:
https://blog.csdn.net/qq_41033254/article/details/90112868