sklearn库学习实验报告

本文详细介绍了使用Python的sk-learn库进行K-means聚类和支持向量机的实验,包括实验目的、鸢尾花数据集和手写数字数据集的应用、K-means聚类算法(包括原理、实现步骤和分析)以及支持向量机的SVC分类器(包括数据预处理、参数选择和测试)。作者分享了实验过程中遇到的问题解决策略和心得体会。
摘要由CSDN通过智能技术生成

一、实验目的

1.理解python语言中sk-learn库的基本函数作用;
2.理解sk-learn库六大基本功能(分类、回归、聚类、数据降维、模型选择和数据预处理);
3.掌握sklearn库中常见机器学习模型。

二、实验内容

使用sklearn库中相关内置数据集(鸢尾花或者手写数字识别数据集)和函数进行练习和测试,完成下面任务中的任意2两个:
(1)支持向量机
(2)K均值聚类
(3)线性回归
根据课堂上对该问题的描述和分析,自行完成程序设计并实现,要求算法描述准确且程序运行正确。

三、设计与实现

详细描述设计过程、关键问题的实现方法及算法的分析说明。
1、K-means聚类算法
(1)数据集介绍
本实验应用鸢尾花数据集,它分为三个类别,即Iris setosa(山鸢尾)、Iris versicolor(变色鸢尾)和Iris virginica(弗吉尼亚鸢尾),每个类别各有50个实例。数据集定义了五个属性:sepal length(花萼长)、sepal width(花萼宽)、petal length(花瓣长)、petal width(花瓣宽)、class(类别)。最后一个属性一般作为类别属性,其余属性为数值,单位为厘米。
(2)算法原理
K-means属于无监督学习,可以在数据集中分为相似的组(簇),使得组内数据的相似度较高,组间之间的相似度较低。
步骤如下:
1.从样本中选择k个点作为初始簇中心;
2.计算每个样本到各个簇中心的距离,将样本划分到距离最近的簇中心所对应的簇中;
3.根据每个簇中的所有样本,重新计算簇中心,并更新;
4.重复步骤2与3,直到簇中心的位置变化小于指定的阈值或者达到最大迭代次数为止。
(3)设计过程
a.首先导入相关的库和数据
b.取部分特征作散点图
c.使用KMeans聚类算法实现簇的聚类,我们选取簇的个数为3
d.数值分析,分析各簇中心坐标,各簇聚类数量,数据聚类结果
e.拼接数据与聚类结果
f.划分学习后的类别数据
g.作散点对比图
2、支持向量机算法
(1)数据集介绍
本实验采用MNIST-image手写数字集进行训练和测试。MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个训练样本和10000个测试样本组成,每个样本都是一张20 * 20像素的灰度手写数字图片。数字已经过尺寸标准化,并以固定尺寸的图像为中心。
(2)算法原理
SVM 主要用于解决二分类的问题,最常使用的是 SVC 类。
步骤如下:
1.读取数据,将原始数据转化为 SVM 算法所能识别的数据格式;
2.将数据标准化,防止样本中不同特征数值大小相差较大影响分类器性能;
3.选择核函数,在不清楚何种核函数最佳时,推荐使用“rbf”(径向基核函数)
4.利用交叉验证网格搜索寻找最优参数;(交叉验证的目的是防止过拟合,利用网格搜索可以在指定的范围内寻找最优参数)
5.使用最优参数来训练模型;
6.测试得到的分类模型。
(3)设计过程
a.首先导入相关的库和数据
b.加载scikit-learn自带的手写数字识别图片数据集,对数据所代表的图片进行显示,图片为数据,具体代表的数字为目标值(显示0-7数字,分两行四列)
c.制作数据集,将数据集分为训练集和测试集,将数据集中的20%作为测试数据集
d.选择支持向量机训练模型,通过调整参数,最终确定参数设置为:gamma=0.001,C=100
e.对模型进行测试,将测试数据里的部分图片显示出来,并且在图片的左下角显示预测值,在右下角显示真实值
f.保存训练好的模型参数
g.导入训练已保存的模型参数,进行预测。

四、测试与分析(附测试用例,运行结果截图等)

1、K-means算法
在这里插入图片描述
在这里插入图片描述
我们可以看到,花朵属性总共为4列,分别对应sepal length(花萼长)、sepal width(花萼宽)、petal length(花瓣长)、petal width(花瓣宽),这里我们只取了3行出来;类别我们分为了3类,分别对应了0、1、2。
在这里插入图片描述
这里我们取它的petal length(花瓣长)、petal width(花瓣宽)作为特征作图。
在这里插入图片描述
各簇的中心点,每个点有四个特征值。
在这里插入图片描述
结果为2的簇中有62个样本,结果为1的簇中有50个样本,结果为0的簇中有38个样本。
在这里插入图片描述
将特征值与簇中分类的结果进行拼接,得到如上结果。
在这里插入图片描述
将原始数据和机器学习之后的数据进行可视化展示,我们可以看出左下角的setosa簇是学习最好的,中间的versicolor簇学习到了一些virginica的点,virginica也学习到了两个versicolor的点左下角的setosa簇是学习最好的,中间的versicolor簇学习到了一些virginica的点,virginica也学习到了两个versicolor的点。
2、支持向量机算法
在这里插入图片描述
显示数据集中数据所代表的图片。
在这里插入图片描述
打印图片数据的形状为(1797,8,8),数据的形状为(1797,64)。
在这里插入图片描述
将测试数据中的图片进行显示,左下角为预测值,右下角为真实值,我们可以看出对于展示的16张图片中,第五张图片预测错误。
在这里插入图片描述
测试集数据预测结果的正确率为0.977777777777,数据集预测结果的正确率为0.9955481357。

五、设计技巧及体会

1.实验过程中遇到的问题及解决办法;
问题:明白算法原理、算法步骤但是具体实现时无从下手;对于实验中需要的某些函数应用不熟练;之前安装某些库中的功能不完整。
解决办法:在官网重新安装所需库,保证库的版本和Python的版本对应一致;对之前学习的知识进行整理回顾,在分析实验要求时,一步一步理清思路,明白如何根据算法原理,对数据进行分类预测;对一些类似算法案例进行学习,不断扩充角度,从而满足本实验的需求。
2.对设计进行评价(优点与不足);
优点:基本完成实验要求,对之前所学习的库和函数进行了应用,并且进一步明显算法的原理、步骤,设计过程有条有理,循序渐进,简单明了,对实验结果详细说明,对实验过程的步骤一步步进行展示。
缺点:在完成实验的基础上,还可以进一步调整模型的参数,达到更高的准确率,对多角度的属性进行分析,发现其中的不同之处,应该对其他可能的需求进行思考,发现更多的数据规律与应用价值。
3.对设计及调试过程的心得体会。
本次实验相比于前三次实验难度更大,不仅仅停留在简单的数据处理,函数使用,而是对于算法的实验,不止要理解算法的原理,还要明显实现的逻辑,并最终实现出来。完成实验时,首先是对于思路的分析,明确目标,需要使用的数据,对数据进行预处理,需要使用的到的函数,了解函数对应的参数,其次,在完成实验要求的基础上,保证代码简洁,适当添加注释进行说明,然后对于Python库的学习不能停留在简单的掌握,课下还需进行深入的自主学习,除了本次实验完成的算法之外,还应对其他算法进行实现,确保在明白算法原理的基础之上,还可以真正对数据进行分析,最后一点,就是多练习多敲代码,只有真正的将学到的知识,应用到实际中,才能真正掌握。

六、附源代码

1、K-means算法

from sklearn import datasets		# 存放鸢尾花数据
from sklearn.cluster import KMeans	# 机器学习模型
import matplotlib.pyplot as plt
import pandas as pd

iris = datasets.load_iris()
iris_X = iris.data				# 花朵属性
iris_y = iris.target			# 花朵类别

print(iris_X[:3])
print(iris_y)

plt.scatter(iris_X[:50,2],iris_X[:50,3],label='setosa',marker='o')
plt.scatter(iris_X[50:100,2],iris_X[50:100,3],label='versicolor',marker='x')
plt.scatter(iris_X[100:,2],iris_X[100:,3],label='virginica',marker='+')
plt.xlabel('petal length')
plt.ylabel('petal width')
plt.title("actual result")
plt.legend()
plt.show()

km = KMeans(n_clusters=3)			# 设定簇的定值为3
km.fit(iris_X)						# 对数据进行聚类
center = km.cluster_centers_
print(center)
num = pd.Series(km.labels_).value_counts()
print(num)
y_train = pd.Series(km.labels_)
y_train.rename('res',inplace=True)
print(y_train)
result = pd.concat([pd.DataFrame(iris_X),y_train],axis=1)
print(result)
Category_one = result[result['res'].values == 0]
k1 = result.iloc[Category_one.index]
# print(k1)
Category_two = result[result['res'].values == 1]
k2 = result.iloc[Category_two.index]
# print(k2)
Category_three = result[result['res'].values == 2]
k3 =result.iloc[Category_three.index]
# print(k3)
# 原始数据的特征散点图
plt.scatter(iris_X[:50,2],iris_X[:50,3],label='setosa',marker='o',c='yellow')
plt.scatter(iris_X[50:100,2],iris_X[50:100,3],label='versicolor',marker='o',c='green')
plt.scatter(iris_X[100:,2],iris_X[100:,3],label='virginica',marker='o',c='blue')
# 机器学习后数据的特征散点图
plt.scatter(k1.iloc[:,2],k1.iloc[:,3],label='cluster_one',marker='+',c='brown')
plt.scatter(k2.iloc[:,2],k2.iloc[:,3],label='cluster_two',marker='+',c='red')
plt.scatter(k3.iloc[:,2],k3.iloc[:,3],label='cluster_three',marker='+',c='black')
plt.xlabel('petal length')			# 花瓣长
plt.ylabel('petal width')			# 花瓣宽
plt.title("result of KMeans")
plt.legend()
plt.show()

2、支持向量机算法

from sklearn import datasets
import joblib
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import svm

digits = datasets.load_digits()    #加载scikit-learn自带的手写数字识别图片数据集
#将数据所代表的图片显示出来
images_and_labels = list(zip(digits.images, digits.target))
plt.figure(figsize=(8,6), dpi=200)
for index, (image, label) in enumerate(images_and_labels[:8]):
    plt.subplot(2, 4, index+1)
    plt.axis('off')
    plt.imshow(image, cmap=plt.cm.gray_r, interpolation='nearest')
    plt.title('Digit: %i' %label, fontsize=20)
plt.show()
print("shape of raw image data:{0}".format(digits.images.shape))
print("shape of data: {0}".format(digits.data.shape))
#将数据集分成训练集和测试集,其中20%作为测试数据集
Xtrain, Xtest, Ytrain, Ytest = train_test_split(digits.data, digits.target, test_size=0.2, random_state=2)    #X为图片数据,Y为标记
#选择支持向量机来训练模型
clf = svm.SVC(gamma=0.001, C=100.)
clf.fit(Xtrain, Ytrain);        #fit(训练集样本,训练集标记)
#模型测试,返回正确率
print("测试集预测正确率:",clf.score(Xtest, Ytest))        #score(测试集样本,测试集标记)

#将测试数据里的部分图片显示出来,并且在图片的左下角显示预测值,在右下角显示真实值
fig, axes = plt.subplots(4, 4, figsize=(8,8))
fig.subplots_adjust(hspace=0.1, wspace=0.1)
Ypred = clf.predict(Xtest)
for i, ax in enumerate(axes.flat):
    ax.imshow(Xtest[i].reshape(8,8), cmap=plt.cm.gray_r, interpolation='nearest')
    ax.text(0.05, 0.05, str(Ypred[i]), fontsize=32, transform=ax.transAxes, color='green' if Ypred[i] == Ytest[i] else 'red')
    ax.text(0.8, 0.05, str(Ytest[i]), fontsize=32, transform=ax.transAxes, color='black')
    ax.set_xticks([])
    ax.set_yticks([])
plt.show()

# 保存模型参数
joblib.dump(clf, 'digits_svm.pkl');

#导入训练好已保存的模型参数,直接进行预测
clf = joblib.load('digits_svm.pkl')
Ypred = clf.predict(digits.data)   #预测标记
print("数据预测值正确率:",clf.score(digits.data, digits.target))
  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值