机器学习Day2(西瓜书阅读第二章+约会和手写数字识别)

117 阅读5分钟

西瓜书第二章阅读

泛化误差与训练误差

“过拟合“

把训练样本自身的一些特点当作了所有潜在样本都 会具有的一般性质,这样就会导致泛化性能下降

那误差超过多少算过拟合

如何进行评估是否过拟合

欠拟合比较容易克服,例如在决策树学习中扩展分 支、在神经网络学习中增加训练轮数等,而过拟合则很麻烦.在后面的学习中 我们将看到,过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一 些针对过拟合的措施;然而必须认识到,过拟合是无法彻底避免的,我们所能做 的只是“缓解”,或者说减小其风险

当使用不同的参数配置时,也会产生不同的模型

经典大模型炼丹调参

  1. 如何评估:

    1. 分训练集与测试集:核心是要保证测试集与训练集互斥

      1. 留出法-直接分割出互斥的两个集合

        1. 这个问题没有完美的解决方案,常见做法是将大约2/3 4/ 5的 样本用于训练,剩余样本用于测试.

  1. 交叉验证法

    1. 将整个集合平均m等分,每次取k-1份当成测试集,然后把多个结果求平均
    2. 优点在于,当k趋近于m时,结果越准确,因为k越趋近于m,整个测试集和数据集是大体相等的。当k=m时,叫留一法
    3. 问题很明显,一旦数据多了,需要非常多次的训练
  2. 自助法

    1. 给我看呆住了,直接记结论吧,数据小时不常用
  3. 到了喜闻乐见的调参数环节了

    1. 调整的参数是一个变量,模型算法的选择是一个变量,这两个变量都能绝对最终的效果
  4. 性能度量

    1. 将机器判断的结果和人工判断的结果进行比较
  5. 错误率与精度

  6. 查准率查全率

    1. 有点涉及到推荐算法了

    2. 当一个搜索算法的结果,又全又准的时候,这个算法肯定更好

k-近邻算法(约会+手写数字识别)

整个算法-应用的流程

  1. 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。

  2. 准备数据:使用Python解析、预处理数据。

  3. 分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。

  4. 测试算法:计算错误率。

  5. 使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。

从github上下一个数据集

github.com/Jack-Cheris…

约会推荐算法:

数据主要包含以下3种特征:

  1. 每年获得的飞行常客里程数
  2. 玩视频游戏所消耗时间百分比
  3. 每周消费的冰淇淋公升数

喜欢程度分类:

  1. 不喜欢的人
  2. 魅力一般的人
  3. 极具魅力的人

最后得到一个,输入对应的特征值,返回该女士对这个男生有多喜欢的程序

# -*- coding: UTF-8 -*-
import numpy as np
"""
函数说明:打开并解析文件,对数据进行分类:1代表不喜欢,2代表魅力一般,3代表极具魅力

Parameters:
    filename - 文件名
Returns:
    returnMat - 特征矩阵
    classLabelVector - 分类Label向量
    """
    
def file2matrix(filename):
    #打开文件
    fr = open(filename)
    #读取文件所有内容
    arrayOLines = fr.readlines()
    #得到文件行数
    numberOfLines = len(arrayOLines)
    #返回的NumPy矩阵,解析完成的数据:numberOfLines行,3列
    returnMat = np.zeros((numberOfLines,3))
    #返回的分类标签向量
    classLabelVector = []
    #行的索引值
    index = 0
    for line in arrayOLines:
        #s.strip(rm),当rm空时,默认删除空白符(包括'\n','\r','\t',' ')
        line = line.strip()
        #使用s.split(str="",num=string,cout(str))将字符串根据'\t'分隔符进行切片。
        listFromLine = line.split('\t')
        #将数据前三列提取出来,存放到returnMat的NumPy矩阵中,也就是特征矩阵
        returnMat[index,:] = listFromLine[0:3]
        #根据文本中标记的喜欢的程度进行分类,1代表不喜欢,2代表魅力一般,3代表极具魅力
        if listFromLine[-1] == 'didntLike':
            classLabelVector.append(1)
        elif listFromLine[-1] == 'smallDoses':
            classLabelVector.append(2)
        elif listFromLine[-1] == 'largeDoses':
            classLabelVector.append(3)
        index += 1
    return returnMat, classLabelVector

"""
函数说明:main函数

Parameters:
    无
Returns:
    无

"""
if __name__ == '__main__':
    #打开的文件名
    filename = "datingTestSet.txt"
    #打开并处理数据
    datingDataMat, datingLabels = file2matrix(filename)
    print(datingDataMat)
    print(datingLabels)
    

简单进行一个错误率的评估:

我们可以得到分类器的错误率-分类器给出错误结果的次数除以测试执行的总数。错误率是常用的评估方法

k-近邻算法没有进行数据的训练,直接使用未知的数据与已知的数据进行比较

vscode一直给我报错找不到路径,必须要我指定文件路径才可以

但是powershell就不报错

报错这个

AttributeError: Text.set() got an unexpected keyword argument 'FontProperties'

claude说这个模块有更新,我就让他给我更新一下,然后就跑出来了

然后再实现一下输入一组数据,进行喜欢程度的判断

手写识别算法:

首先就有一个坑,sklearn的安装

默认的pip安装是只有numpy,而不是numpy+mkl

所以要用第三方链接下载

但我还是出问题了,为什么,我最后发现我下载的sklearn和Python环境对应的版本不匹配

  1. 首先确认sklearn安装在哪个Python环境:
# 在命令行执行
python -c "import sys; print(sys.executable)"
python -c "import sklearn; print(sklearn.__file__)"

2. 然后查看运行脚本时使用的Python环境:

# 查看py命令指向的Python版本
py --version

# 或者使用where命令
where python
where py

然后在指定版本运行py代码就出来了

参考原文

cuijiahua.com/blog/2017/1…