机器学习实验二 K折交叉验证找最佳K值并可视化分析

这篇具有很好参考价值的文章主要介绍了机器学习实验二 K折交叉验证找最佳K值并可视化分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

机器学习实验报告

实验题目:K折交叉验证找最佳K值并可视化分析

一、实验目的:

(1)K折交叉验证是一种常用的模型评估方法,它可以在有限的数据下充分利用数据集,提高模型精度和泛化能力。K折交叉验证将数据集分成K个互不重叠的子集,每次选取其中一个子集作为测试集,剩余K-1个子集作为训练集,然后计算模型在测试集上的误差,重复该过程K次,最终得到K个误差值的平均数作为模型的性能指标。

(2)寻找最佳的K值可以通过在一定范围内遍历K值,比较不同K值下模型的性能指标来确定最佳的K值。比如,可以从2开始尝试不同的K值,直到最大的K值等于数据集大小。通常情况下,K的取值范围应该保证每个折样本数量都足够大,同时也不能太小导致评估不准确或者过拟合。

(3)为了进行可视化分析实验,可以将不同K值对应的模型性能指标以折线图或者柱状图的形式进行可视化展示。这样可以直观地比较不同K值下模型的性能表现,并确定最佳的K值。

二、实验步骤:

① 导入必要的库和加载鸢尾花数据集并且分类

② 采用独立的验证集

③ 折交叉验证

④ 取前2维特征,在2D平面上可视化决策边界

三、实验结果:

实验代码(完整):

import pandas as pd
import numpy as np
#KNN
from sklearn.neighbors import KNeighborsClassifier
# 模型性能的评价
from sklearn.metrics import accuracy_score
#作图
import matplotlib.pyplot as plt
#显示中文

plt.rcParams['font.family'] = ['sans-serif']
plt.rcParams['font.sans-serif'] = ['SimHei']
#读取数据
# csv文件没有列名,增加列名
feat_names = ['sepal-length', 'sepal-width', 'petal-length', 'petal-width', 'Class']
dpath = "./"
df = pd.read_csv(dpath + "iris.csv", names = feat_names)
print("通过观察前5行,了解数据每列(特征)的概况:\n"+str(df.head()))
#通过观察前5行,了解数据每列(特征)的概况
# 数据总体信息
print("数据总体信息:")
df.info()
#只考虑两类分类:setosa vs. non_setosa
target_map = {'Iris-setosa':0,
              'Iris-versicolor':1,
              'Iris-virginica':2 }  #2
# Use the pandas apply method to numerically encode our attrition target variable
df['Class'] = df['Class'].apply(lambda x: target_map[x])
# 从原始数据中分离输入特征x和输出y
y = df['Class']
X = df.drop('Class', axis = 1)
# 特征缩放:数据标准化
from sklearn.preprocessing import StandardScaler
#模型训练
scaler = StandardScaler()
scaler.fit(X)
#特征缩放
X = scaler.transform(X)
#X_test = scaler.transform(X_test)
#将数据分割训练数据与测试数据
from sklearn.model_selection import train_test_split
# 随机采样20%的数据构建验证集,其余作为训练样本
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=33, test_size=0.2)
# 设置超参数的搜索范围
Ks = range(1, 40)
# 不同超参数对应的模型性能
accuracy = []
for j, K in enumerate(Ks):
    knn = KNeighborsClassifier(n_neighbors=K)
    knn.fit(X_train, y_train)

    y_pred = knn.predict(X_test)
    accuracy.append(accuracy_score(y_test, y_pred))

### 最佳超参数
index = np.unravel_index(np.argmax(accuracy), len(Ks))
best_parameter = Ks[ index[0] ]

print("最佳超参数:\n"+str(best_parameter))
print("最佳参数对应的模型性能:\n"+str(accuracy[best_parameter]))

#不同超参数K对应的验证集上的性能
plt.figure(figsize=(12, 6))
plt.plot(Ks, accuracy, color='b', linestyle='dashed', marker='o',
         markerfacecolor='b', markersize=10)

#最佳超参数
plt.axvline(best_parameter, color='r', ls='--')

plt.xlabel(u'K')
plt.ylabel(u'正确率')

from sklearn.model_selection import GridSearchCV

#设置超参数搜索范围
tuned_parameters = dict(n_neighbors = Ks)

#生成学习器实例
knn = KNeighborsClassifier()

#生成GridSearchCV实例
grid= GridSearchCV(knn, tuned_parameters,cv=15, scoring='accuracy',n_jobs = 4)

#训练,交叉验证对超参数调优
print(grid.fit(X,y))

best_parameter = grid.best_params_['n_neighbors']
best_parameter

# plot CV误差曲线
accuracy = grid.cv_results_[ 'mean_test_score' ]

plt.figure(figsize=(12, 6))
plt.plot(Ks, accuracy, color='b', linestyle='dashed', marker='o',
         markerfacecolor='b', markersize=10)

#最佳超参数
plt.axvline(best_parameter, color='r', ls='--')

plt.xlabel(u'K')
plt.ylabel(u'正确率')

best_parameter

accuracy[best_parameter]

best_parameter

###########################取前2维特征,在2D平面上可视化决策边界##########################

#用所用的数据做训练
X_train = X
y_train = y

#取前2维特征
X_train_2d = X_train[:, :2]

#训练分类器
knn = KNeighborsClassifier(n_neighbors = 3)

knn.fit(X_train_2d, y_train)

# 画出分类器的决策边界
def plot_2d_separator(classifier, X, fill=False, ax=None, eps=None):
    if eps is None:
        eps = X.std() / 2.

    x1_min, x2_min = X.min(axis=0) - eps
    x1_max, x2_max = X.max(axis=0) + eps

    x1 = np.linspace(x1_min, x1_max, 500)
    x2 = np.linspace(x2_min, x2_max, 500)

    # 生成网格采样点
    X1, X2 = np.meshgrid(x1, x2)
    X_grid = np.c_[X1.ravel(), X2.ravel()]

    try:
        decision_values = classifier.decision_function(X_grid)
        levels = [0]
        fill_levels = [decision_values.min(), 0, decision_values.max()]
    except AttributeError:
        # no decision_function
        decision_values = classifier.predict_proba(X_grid)[:, 1]
        levels = [.5]
        fill_levels = [0, .5, 1]

    if ax is None:
        ax = plt.gca()
    if fill:
        ax.contourf(X1, X2, decision_values.reshape(X1.shape),
                    levels=fill_levels, colors=['blue', 'red'])
    else:
        ax.contour(X1, X2, decision_values.reshape(X1.shape), levels=levels,
                   colors="black")

    ax.set_xlim(x1_min, x1_max)
    ax.set_ylim(x2_min, x2_max)
    ax.set_xticks(())
    ax.set_yticks(())

import matplotlib as mpl
plt.figure(figsize=(12, 6))
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
#marks = ['o','^','v']
plt.scatter(X_train_2d[:, 0], X_train_2d[:, 1], c = y_train, cmap=cm_dark,marker='o', edgecolors='k')

plot_2d_separator(knn, X_train_2d) # plot the boundary

#plt.xlabel(df.columns[0])
#plt.ylabel(df.columns[1])
plt.xlabel(u'花萼长度')
plt.ylabel(u'花萼宽度')
plt.legend()

#散点图:绘制花萼长度和花萼宽度之间的散点图,颜色编码为类别分类。可以使用 scatter 函数进行绘制。
plt.figure(figsize=(12,6))
cm_dark = mpl.colors.ListedColormap(['g','r','b'])
plt.scatter(df['sepal-length'], df['sepal-width'], c=df['Class'], cmap=cm_dark, marker='o', edgecolors='k')
plt.xlabel(u'花萼长度')
plt.ylabel(u'花萼宽度')

#柱状图:绘制超参数K的取值范围与对应准确率之间的柱状图,以便比较不同超参数性能。可以使用 bar 函数进行绘制。
plt.figure(figsize=(12, 6))
plt.bar(Ks, accuracy)
plt.axvline(best_parameter, color='r', ls='--')
plt.xlabel(u'K')
plt.ylabel(u'正确率')

#折线图:绘制交叉验证误差与超参数K之间的关系。可以使用 plot 函数进行绘制。
plt.figure(figsize=(12, 6))
plt.plot(Ks, accuracy, color='b', linestyle='dashed', marker='o',
         markerfacecolor='b', markersize=10)
plt.axvline(best_parameter, color='r', ls='--')
plt.xlabel(u'K')
plt.ylabel(u'正确率')

#决策边界图:绘制前两个特征的决策边界图,以便查看模型分类效果。可以使用 contourf 函数进行绘制。
plt.figure(figsize=(12, 6))
cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
plt.scatter(X_train_2d[:, 0], X_train_2d[:, 1], c=y_train, cmap=cm_dark, marker='o', edgecolors='k')
plot_2d_separator(knn, X_train_2d, fill=True) # 绘制决策边界
plt.xlabel(u'花萼长度')
plt.ylabel(u'花萼宽度')
plt.show()

实验结果:

机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python
机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python

不同K值下的模型得分(即准确率)折线图:

机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python

折交叉验证折线图:
机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python

取前2维特征,在2D平面上可视化决策边界散点图:
机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python

问题1:根据给定的Jupyter实例和鸢尾花数据集,认真分析相关函数用法及其参数含义

(1)pd.read_csv(dpath + “iris.csv”, names = feat_names):读取CSV格式文件数据。其中dpath为文件路径,names为列名(特征名)。

(2)StandardScaler():特征缩放,即将每个特征值减去该特征的平均值,然后除以该特征的标准差。

(3)train_test_split(X, y, random_state=33, test_size=0.2):将数据集划分成训练集和测试集。其中X为输入特征集,y为输出标签集,random_state为随机数种子,test_size为测试集所占比例。

(4)KNeighborsClassifier(n_neighbors=k):构建K近邻分类器模型,其中k为最近邻居的数目。

(5)GridSearchCV(estimator, param_grid, scoring=None, cv=None):使用网格搜索法来进行模型参数调优。其中estimator为学习器实例,param_grid为超参数搜索范围,scoring为评价指标,cv为交叉验证的折数。

(6)plt.plot(Ks, accuracy, color=‘b’, linestyle=‘dashed’, marker=‘o’, markerfacecolor=‘b’, markersize=10):画出不同K值对应的正确率曲线图。其中Ks为超参数搜索范围,accuracy为不同超参数下模型的正确率。

(7)plt.axvline(best_parameter, color=‘r’, ls=‘–’):在正确率曲线图上加入最佳超参数的参考线。其中best_parameter为最佳超参数的值。

(8)plt.xlabel(u’K’) / plt.ylabel(u’正确率’):设置横纵坐标的标题名称。

(9)plot_2d_separator(classifier, X, fill=False, ax=None, eps=None):画出分类器的决策边界。其中classifier为分类器实例,X为输入特征,fill、ax、eps为可选参数。

(10)plt.scatter(X_train_2d[:, 0], X_train_2d[:, 1], c = y_train, cmap=cm_dark,marker=‘o’, edgecolors=‘k’):在2D平面上画出训练数据集的散点图。其中X_train_2d为前两维特征,y_train为类别标签,cmap、marker、edgecolors为可选参数。

问题2:加深K折交叉验证的理解

K折交叉验证是一种常用的模型评估方法,其主要思想是将数据集划分为K个互斥的子集,每个子集均做一次测试集,其余的K-1个子集作为训练集,通过K次不同的组合实现了对整个数据集的学习和测试。在这个过程中,我们会计算每次使用不同的训练集所得到的结果,并取平均值作为最终结果。
K折交叉验证的优点在于,它能够多次使用数据集,消除了训练集和测试集的随机性对模型性能评估的影响。而且,由于每个样本都被用于测试和训练,因此可以更有效地利用数据集进行模型评估。同时,K折交叉验证还能避免过拟合产生,提高模型泛化能力。
在具体实现过程中,需要注意以下几点:
1)选择K值时,通常取5或10,但也需要考虑数据集大小和计算资源等因素。
2)数据集需要先进行随机化处理,以保证每个子集中的数据都是随机分布的。
3)在训练和测试的过程中,需要确保测试集和训练集无重叠,即相同的数据不同时出现在训练集和测试集中。
4)在每次训练完成后,需要记录模型的性能指标,如准确率、F1-score等。最终的结果是对所有结果的平均值。
总之,K折交叉验证是一种十分有效的模型评估方法,可以帮助我们准确评估模型性能并避免过拟合问题。需要根据具体需求选择合适的K值,并注意实现过程中的细节问题。

问题3:加深对网格搜索法GridSearch CV()参数调优认识

网格搜索法(GridSearchCV)是一种常见的超参数调优方法,它通过遍历所有指定的参数组合,在给定的参数网格中对每个参数组合进行交叉验证,从而找到最佳的超参数组合。
在使用网格搜索时,我们需要先定义要调整的超参数和其取值范围,然后使用GridSearchCV函数指定参数范围,并设置交叉验证的折数。具体来说,GridSearchCV可以传入以下参数:
estimator:估计器对象,即我们要训练的模型
param_grid:需要搜索的参数空间,以字典格式传入,其中键为需要调整的超参数名,值为该超参数可能的取值列表
scoring:评价指标,默认为None,使用模型score方法(如分类问题中的准确率),也可以自定义评价函数
cv:交叉验证折数,默认为3折
n_jobs:并行处理的数量,默认为1,可以设置为-1表示使用全部可用的CPU
当GridSearchCV执行完成后,我们可以使用best_params_属性查看最佳超参数组合,使用best_score_属性查看最佳模型得分,还可以使用cv_results_属性查看所有参数组合及其对应的得分等信息。
需要注意的是,由于网格搜索法需要遍历所有可能的参数组合,所以在参数空间较大时,计算成本会很高,需要耗费较长时间。因此在实际应用中,我们需要根据具体情况选择适当的参数空间和交叉验证折数,以平衡时间成本和结果精度。
总之,网格搜索法是一种有效的超参数调优方法,通过遍历不同参数组合对模型性能进行评估,帮助我们找到最佳的模型超参数组合。需要注意调整的参数范围、交叉验证折数等细节问题。

问题4:进行相关可视化分析(利用Matplotlib,seaborn等可视化库,采用散点图、柱状图、折线图等进行对比分析)

①散点图:绘制花萼长度和花萼宽度之间的散点图,颜色编码为类别分类。可以使用 scatter 函数进行绘制。

实验结果:
机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python

②柱状图:绘制超参数K的取值范围与对应准确率之间的柱状图,以便比较不同超参数性能。可以使用 bar 函数进行绘制。

实验结果:
机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python

③折线图:绘制交叉验证误差与超参数K之间的关系。可以使用 plot 函数进行绘制。

实验结果:
机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python

④决策边界图:绘制前两个特征的决策边界图,以便查看模型分类效果。可以使用 contourf 函数进行绘制。

实验结果:
机器学习k值,机器学习实验和大作业课程设计,机器学习,人工智能,python

对比分析结果:
散点图用于展示不同类别样本在特征空间中的分布情况,柱状图则用于比较不同超参数K下模型的性能。折线图则展示不同超参数K值下模型的交叉验证误差,帮助我们选择最佳超参数。最后,决策边界图用于展示模型在特征空间中的分类效果,以便直观地评估模型的性能。
通过这些可视化结果,我们可以看到最佳超参数为9,并且模型的准确率在不同超参数K下具有明显变化。同时,我们还可以看到模型的决策边界绘制出来,以便更好地理解模型分类效果,进一步优化算法和模型性能。

四、实验心得

在使用K折交叉验证寻找最佳的K值时,我首先将鸢尾花数据集进行了预处理,包括数据清洗、特征选择和标签编码等步骤。接着,我采用了sklearn库中的KFold函数对数据集进行了K折交叉验证,并分别尝试了不同的K值,比如K=0,1,2,3,…39,40等。
在每个K值下,我都计算了训练集和测试集的准确率,并将结果进行可视化展示。具体来说,我使用matplotlib库绘制了一张折线图,横轴是K值,纵轴是准确率。通过观察可视化结果,我发现当K值为6时,模型的准确率最高,因此我选取K=6作为最佳的K值。
同时,在这个过程中,我也注意到一些需要注意的点。比如,对于较小的数据集,不能选择过大的K值,否则会导致测试集样本数太少而影响模型的泛化能力;另外,在使用K折交叉验证时,需要保证每次划分的训练集和测试集的分布差异尽可能小,以充分利用数据集进行模型评估和选择。
总之,通过以上实验,我深刻认识到了K折交叉验证在机器学习中的重要性,掌握了如何通过可视化分析寻找最佳的K值,同时也加深了对数据预处理和模型评估的理解。文章来源地址https://www.toymoban.com/news/detail-714238.html

到了这里,关于机器学习实验二 K折交叉验证找最佳K值并可视化分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【笔记】【机器学习基础】交叉验证

    交叉验证(cross-validation) 是一种 评估泛化性能 的统计学方法,它比单次划分训练集和测试集的方法更加稳定、全面。在交叉验证中,数据被多次划分,并且需要训练多个模型。 最常用的交叉验证是 k 折交叉验证(k-fold cross-validation) ,其中 k 是由用户指定的数字,通常取

    2024年02月03日
    浏览(36)
  • 机器学习中的数学原理——模型评估与交叉验证

    惭愧惭愧!机器学习中的数学原理这个专栏已经很久没有更新了!前段时间一直在学习深度学习,paddlepaddle,刷题专栏跟新了,这个专栏就被打入冷宫了。这个专栏名为 白话机器学习中数学学习笔记 ,主要是用来分享一下我在 机器学习中的学习笔记及一些感悟,也希望对你

    2024年01月15日
    浏览(123)
  • 机器学习,过拟合与欠拟合,正则化与交叉验证

    目录 机器学习 过拟合与欠拟合 正则化与交叉验证 正则化 交叉验证 的目的是使学到的模型 不仅对已知数据而且对未知数据都能有很好的预测能力 。 不同的机器学习方法会给出不同的模型。当损失函数给定时,基于损失函数的模型的训练误差(training error)和模型的测试误

    2024年02月12日
    浏览(46)
  • 【深度学习实验】数据可视化

    目录 一、实验介绍 二、实验环境 三、实验内容 0. 导入库 1. 归一化处理 归一化  实验内容 2. 绘制归一化数据折线图 报错 解决 3. 计算移动平均值SMA 移动平均值 实验内容 4. 绘制移动平均值折线图 5 .同时绘制两图 6. array转换为tensor张量 7. 打印张量       Visualizing the Tren

    2024年02月09日
    浏览(43)
  • 机器学习技术:如何使用交叉验证和ROC曲线提高疾病预测的准确性和效率?

    随着机器学习的普及,评估模型的性能越来越重要。交叉验证和ROC曲线是两种常见的评估模型性能的方法。本文将介绍这两种方法的基本原理和应用场景,并结合实际案例和技术实践,讲解如何使用交叉验证和ROC曲线来提高机器学习模型的性能。此外,文章也将提供一些最佳

    2024年02月11日
    浏览(61)
  • 无涯教程-机器学习 - 数据可视化

    在上一章中,无涯教程讨论了数据对于机器学习算法的重要性,以了解具有统计信息的数据,还有另一种称为可视化的方式来理解数据。 借助数据可视化,可以看到数据的属性保持什么样的关联,这是查看要素是否与输出相对应的最快方法,可以了解具有统计信息的ML数据。

    2024年02月11日
    浏览(36)
  • 【机器学习】可视化模块-seaborn详细教程

    Seaborn是一个基于Python语言的数据可视化库,它能够创建高度吸引人的可视化图表,是在matplotlib库的基础上,提供了更为简便的API和更为丰富的可视化函数,使得数据分析与可视化变得更加容易。Seaborn的设计哲学是以美学为中心,致力于创建最佳的数据可视化,同时也保持着

    2024年02月13日
    浏览(44)
  • 机器学习 | 掌握Matplotlib的可视化图表操作

            Matplotlib是python的一个数据可视化库,用于创建静态、动态和交互式图表。它可以制作多种类型的图表,如折线图、散点图、柱状图、饼图、直方图、3D 图形等。以渐进、交互式方式实现数据可视化。当然博主也不能面面俱到的讲解到所有内容,详情请参考:官网

    2024年01月24日
    浏览(38)
  • [python] 基于Gradio可视化部署机器学习应用

    Gradio是一个开源的Python库,用于构建机器学习和数据科学演示应用。有了Gradio,你可以围绕你的机器学习模型或数据科学工作流程快速创建一个简单漂亮的用户界面。Gradio适用于以下情况: 为客户/合作者/用户/学生演示你的机器学习模型。 通过自动共享链接快速部署你的模

    2023年04月09日
    浏览(53)
  • 机器学习入门实例-加州房价预测-1(数据准备与可视化)

    数据来源:California Housing Prices dataset from the StatLib repository,1990年加州的统计数据。 要求:预测任意一个街区的房价中位数 缩小问题:superwised multiple regressiong(用到人口、收入等特征) univariate regression(只预测一个数据)plain batch learning(数据量不大+不咋变动) 下载数据 可以

    2023年04月19日
    浏览(82)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包