一、了解机器学习
1、什么是机器学习
机器学习是一种人工智能(AI)的分支,旨在让计算机通过数据自动学习和改进。机器学习算法被设计用于从数据中提取模式和规律,然后利用这些模式和规律来做出预测或做出决策,而无需明确的程序指令。
机器学习的基本原理是利用大量的输入数据进行训练,然后使用这些数据训练出的模型来进行预测和决策。训练过程一般包括以下步骤:数据收集和准备、选择合适的模型、训练模型、评估和优化模型。
2、机器学习的步骤
简单来说就是下图所示流程:
**1) 数据收集和准备:**收集和整理适用于问题的数据集。这可能包括数据清洗、特征选择、处理缺失值和异常值等。
**2) 特征工程:**从原始数据中提取和选择适当的特征。这可以涉及特征转换、降维、组合特征等操作,以提高模型的性能。
**3) 模型选择和训练:**选择适合问题的机器学习模型,并使用训练数据对其进行训练。模型的选择可以基于问题的类型和数据的特征。
**4) 模型评估:**使用测试数据对训练好的模型进行评估,以了解其在未见过的数据上的性能表现。常见的评估指标包括准确率、召回率、精确率、F1分数等。
**5) 模型优化:**根据评估结果对模型进行调整和优化,以提高其性能。这可以涉及参数调整、特征选择、算法调整等操作。
**6) 部署和应用:**将优化后的模型部署到实际应用中,用于进行预测、决策或提供洞见。模型的部署可以采用各种方式,例如将模型集成到应用程序中、使用API进行远程调用等。
**7) 监控和维护:**对部署的模型进行监控和维护,以保持其性能和准确性。这可以包括定期监测模型的性能指标、处理模型的漂移和退化等。
例如下图,对疫情时期的患病率统计,纵坐标表示患病率,横坐标表示日期,其趋势图为通过大量数据统计,然后再经过可视化得到总体趋势图:
通过这个图可以预测第25号当天的患病率所对应的比例大致位置,而不会随机出现在极高的位置,也不会出现在极低的位置,大概在如图所示的0.6左右,这就是这段流程的大致画面。
3、为什么要学习机器学习
-
**解决复杂问题:**机器学习是一种能够处理大规模和复杂数据的方法,它可以帮助我们解决很多传统算法难以处理的问题,如语音识别、图像分类、自然语言处理等。通过学习机器学习,我们可以利用这些技术来构建智能系统,解决实际问题。
-
**数据驱动决策:**在当今信息爆炸的时代,我们面临着大量的数据,但如何从海量数据中提取有用的信息并做出决策是一个挑战。机器学习可以帮助我们通过训练模型从数据中发现模式和规律,并利用这些模型做出更加准确的预测和决策。学习机器学习可以使我们更好地理解和利用数据,从而做出更好的决策。
-
**创造新的技术和创新:**机器学习是推动科技创新的重要驱动力之一。通过学习机器学习,我们可以了解最新的研究成果和技术进展,从而帮助我们开发出创新的解决方案和应用。机器学习在很多领域都有着广泛的应用,包括医疗保健、金融、交通、农业等,学习机器学习可以让我们更好地理解和应用这些技术,从而推动行业的发展。
-
**提高竞争力和就业前景:**随着机器学习的快速发展,对于掌握机器学习技术的需求也越来越大。学习机器学习可以提高我们在职场上的竞争力,拥有这一技能可以让我们在求职中脱颖而出。很多公司和组织都在积极招聘和培养机器学习专家和工程师,学习机器学习可以给我们带来更多的就业机会和发展空间。
4、机器学习要准备的库
**1)numpy :**它是一个用于进行科学计算的Python库。它提供了一个高效的多维数组对象(ndarray),以及用于对数组进行操作的各种函数和工具。
**2)matplotlib :**它是一个用于绘制数据可视化图表的Python库。它提供了一种类似于MATLAB的绘图接口,可以创建各种类型的图表,包括折线图、散点图、柱状图、饼图、等高线图、热力图等等。Matplotlib可以在Python脚本中生成高质量的图像,支持将图表保存为图片文件或直接显示在窗口中。
**3)pandas :**它是一个用于数据分析和处理的Python库。它提供了灵活且高效的数据结构和数据分析工具,使用户能够轻松地进行数据清洗、转换、聚合、分组和可视化等操作。
**4)sklearn :**scikit-learn(简称sklearn)是一个用于机器学习的Python库。它建立在NumPy、SciPy和Matplotlib等库的基础上,提供了一套完整且易于使用的机器学习工具,适合用于各种机器学习任务,包括分类、回归、聚类等。
二、KNN算法
1、介绍KNN算法
K近邻算法 (K-Nearest Neighbors,简称KNN)是一种常用的监督学习算法,用于解决分类和回归问题。KNN算法是一种基于实例的学习方法,通过查找训练数据集中与目标样本最接近的K个最近邻样本,来进行分类或回归预测。
在KNN算法中,K代表需要考虑的最近邻样本的数量 。当进行分类 问题时,KNN算法将被分类样本分配给K个最近邻样本中所占比例最多的类别 。对于回归 问题,KNN算法计算K个最近邻样本的平均值,并将其作为预测值。
KNN算法的基本原理 是基于样本在特征空间中的距离进行分类或回归 。常用的距离度量方法包括欧氏距离、曼哈顿距离、闵可夫斯基距离等。
实例解析1
如下图所示,我有一套房子想卖了,但是却不知道当前行情价格多少,但是附近邻居有几个卖了房子的,他们的房子大小和我的差不太多,所以我就划定一个范围,确定我的最近距离的几个邻居房价的平均值来定我自己房价的多少,如果觉得数据少了,那就多找几个邻居来做平均值,如此即可判断自己房价的多少。
实例解析2
如下图所示,有三组数据,将他们分别标记在坐标轴上得到如图所示状态,现在有一组数据不知道是哪一组的数据,将它标记出来后,划定周围一定范围内的其他数据点的个数,然后去数哪一类数据点最多,那么他就属于这一类数据的。
而这三组数据全部显示在一个坐标系,将他们固定,那么这三组数据就是训练数据 ,而外部不知道的那一组数据就叫测试数据
2、KNN算法---距离公式
1)欧氏距离
也叫坐标系中点到点之间的距离。
距离公式如下:
2)曼哈顿距离
就相当于点到点之间x轴走的距离加y轴走的距离
距离公式如下:
3、KNN算法优缺点
KNN算法的优点:
-
**简单易懂:**KNN算法的实现非常简单,易于理解和实现。
-
**非参数化:**KNN算法是一种非参数化的算法,没有对数据分布做出假设,适用于不同类型的数据。
-
**可扩展性:**KNN算法适用于多类别问题,能够处理具有多个类别的分类任务。
KNN算法的缺点:
-
**计算复杂度高:**对于大规模数据集,KNN算法需要计算目标样本与所有训练样本的距离,计算复杂度较高,计算时间较长。
-
高度依赖数据结构:KNN算法对于样本的分布和密度非常敏感,对于不均匀分布的数据集可能会产生误分类。
-
**数据不平衡问题:**在KNN算法中,样本数量较多的类别会对分类结果产生更大的影响,而数量较少的类别可能被忽略。
4、scikit-learn 库(简称sklearn)
1)Sklearn是什么?
sklearn是一个Python机器学习库,全称为scikit-learn。它提供了许多用于处理和分析数据的工具和算法,包括数据预处理、特征工程、模型选择和评估等。sklearn内置了多种常用的机器学习算法,如线性回归、逻辑回归、决策树、随机森林、支持向量机、聚类等。同时,sklearn还提供了许多可视化工具,用于帮助用户进行数据探索和结果展示。通过使用sklearn,用户可以快速构建和部署机器学习模型。
2)sklearn安装
在命令提示符中输入下列命令,注意安装版本,不同版本有部分功能不同,可以在下列代码的scikit-learn后面加==x.x.x,x.x.x为版本号
python
pip install scikit-learn -i https://pypi.tuna.tsinghua.edu.cn/simple/
3)使用方法
用sklearn官网API:https://scikit-learn.org/
knn算法的介绍 搜索k-nearest neighbors,注意版本1.0和1.2问题
三、数据可视化
现在有很多大学里出现室友矛盾,假如室友可以选择: 大学里面 ,对于校方,把类型相同的学生放在一个寝室,在基于大二大三大四的,现已存在一个数据文件datingTestSet2.txt,为历年大学生的调查问卷表:
第1列:每年旅行的路程
第2列:玩游戏所有时间百分比
第3列:每个礼拜消耗零食的重量
第4列:学生所属的类别,1表示爱学习,2表示一般般,3表示爱玩。
目的为学生在大学中挑选室友的信息,其内部数据部分如下所示
首先确定流程:收集数据 -> 建立模型训练 -> 预测数据
当前已经收集好数据存放在datingTestSet2.txt文件里,
1、可视化查看数据
直接看代码:
python
import matplotlib.pyplot as plt
import numpy as np
date = np.loadtxt('datingTestSet2.txt') #导入数据
# 分类 1 2 3,分别取出每个类别的学生信息
date_1 = date[date[:,-1]==1]
date_2 = date[date[:,-1]==2]
date_3 = date[date[:,-1]==3]
a = plt.figure() #创建画布
b = plt.axes(projection='3d') #设置为3d图像
# scatter为散点图,期内参数分别代表x轴y轴z轴数据,c为颜色,marker为散点图形
b.scatter(date_1[:,0],date_1[:,1],date_1[:,2],c='#696969',marker='+')
b.scatter(date_2[:,0],date_2[:,1],date_2[:,2],c='#FF6A6A',marker='o')
b.scatter(date_3[:,0],date_3[:,1],date_3[:,2],c='#8A2BE2',marker='3')
# 展示中文
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus']=False
# 展示数据
plt.title('学生类别')
b.set(xlabel='里程数',ylabel='游戏时间百分比',zlabel='食品质量')
plt.show()
输出结果如下图,即不同颜色对应不同分类的学生:
2、使用KNN算法预测
代码如下:
python
import numpy as np
from sklearn.neighbors import KNeighborsClassifier # 导入包,表示使用分类算法
date = np.loadtxt('datingTestSet2.txt') #导入数据
date_x = date[:,:-1] # 取行为所有行,列为从第一列到最后一列,不包含最后一列数据
date_y = date[:,-1] # 取行为所有行,列为最后一列的数据
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(date_x,date_y) # 使用fit,对上述数据进行训练
# 测试单条数据
print(knn.predict([[1215, 1.14656, 1.122]]))
# 测试多条数据
a = [[1221,0.12654,12.1522],[4651,1.3256,15.135],[45631,6.23,1.11111]]
print(knn.predict(a))
其运行结果为:
第一行表示输入的一组数据为2类学生,第二行表示输入的多组数据为2,2,3类数据