西瓜书第二章阅读
泛化误差与训练误差
“过拟合“
把训练样本自身的一些特点当作了所有潜在样本都 会具有的一般性质,这样就会导致泛化性能下降
那误差超过多少算过拟合
如何进行评估是否过拟合
欠拟合比较容易克服,例如在决策树学习中扩展分 支、在神经网络学习中增加训练轮数等,而过拟合则很麻烦.在后面的学习中 我们将看到,过拟合是机器学习面临的关键障碍,各类学习算法都必然带有一 些针对过拟合的措施;然而必须认识到,过拟合是无法彻底避免的,我们所能做 的只是“缓解”,或者说减小其风险
当使用不同的参数配置时,也会产生不同的模型
经典大模型炼丹调参
-
如何评估:
-
分训练集与测试集:核心是要保证测试集与训练集互斥
-
留出法-直接分割出互斥的两个集合
- 这个问题没有完美的解决方案,常见做法是将大约2/3 4/ 5的 样本用于训练,剩余样本用于测试.
-
-
-
交叉验证法
- 将整个集合平均m等分,每次取k-1份当成测试集,然后把多个结果求平均
- 优点在于,当k趋近于m时,结果越准确,因为k越趋近于m,整个测试集和数据集是大体相等的。当k=m时,叫留一法
- 问题很明显,一旦数据多了,需要非常多次的训练
-
自助法
- 给我看呆住了,直接记结论吧,数据小时不常用
-
到了喜闻乐见的调参数环节了
- 调整的参数是一个变量,模型算法的选择是一个变量,这两个变量都能绝对最终的效果
-
性能度量
- 将机器判断的结果和人工判断的结果进行比较
-
错误率与精度
-
查准率查全率
-
-
有点涉及到推荐算法了
-
-
当一个搜索算法的结果,又全又准的时候,这个算法肯定更好
-
k-近邻算法(约会+手写数字识别)
整个算法-应用的流程
-
收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据。一般来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。
-
准备数据:使用Python解析、预处理数据。
-
分析数据:可以使用很多方法对数据进行分析,例如使用Matplotlib将数据可视化。
-
测试算法:计算错误率。
-
使用算法:错误率在可接受范围内,就可以运行k-近邻算法进行分类。
从github上下一个数据集
约会推荐算法:
数据主要包含以下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环境对应的版本不匹配
- 首先确认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代码就出来了
参考原文