(四)人工智能之机器学习
淘金铲 2024-07-29 09:31:02 阅读 52
目录
(一)机器学习基础
1.1、基本概念
(二)机器学习相关理论
2.1、监督学习与无监督学习
2.2、过拟合与欠拟合
2.3、评估指标
(三)经典机器学习算法
3.1、线性回归与逻辑回归
3.2、决策树与随机森林
3.3、支持向量机(SVM)
3.4、K-近邻算法(KNN)
(四)简单线性回归
4.1、导入必要的库
4.2、准备数据
4.3、训练模型
4.4、做出预测
4.5、评估模型
4.6、可视化结果
(五)总结
引言
在上一章节,介绍了Python的基础知识,帮助你了解了变量、数据类型、函数等。已经初步熟悉编写和运行Python代码的基本技能,本章节介绍机器学习相关知识理论及应用
(一)机器学习基础
机器学习是人工智能的一个分支,旨在让计算机从数据中学习并做出预测或决策。这里将从基础概念入手,结合简单的代码例子,带你一步步学习机器学习。
1.1、基本概念
数据集:训练机器学习模型的数据,通常分为训练集和测试集
特征:用于预测目标值的输入变量
目标值:模型试图预测的输出
模型:从数据中学习到的数学表示,用于做出预测
(二)机器学习相关理论
2.1、监督学习与无监督学习
监督学习
监督学习(Supervised Learning)就像你在学校里上课时,老师教你一项新技能。你有一组数据,这些数据包含输入(特征)和输出(标签)。你的任务是训练一个模型,使它能够根据新的输入数据预测正确的输出。
示例:
假设你想预测一个人的工资,你有一个包含多个人的工作经验和工资的数据集。你可以用这个数据集来训练模型,让模型学会根据工作经验预测工资。
无监督学习
无监督学习(Unsupervised Learning)就像你搬到一个新城市,没有任何信息,你需要自己探索并发现这个城市的规律。在无监督学习中,数据只有输入,没有对应的输出。你的任务是从数据中发现结构或模式。
示例:
假设你有一堆不同类型的水果照片,你想根据照片的特征把这些水果分成不同的类别,但你事先不知道有多少种类。你可以使用聚类算法,比如K-means,来进行分类。
2.2、过拟合与欠拟合
过拟合(Overfitting)就像你在考试时死记硬背了所有练习题,但一旦遇到新题目,就不会做了。模型在训练数据上表现得很好,但在新数据上表现得很差,因为它过于“记住”训练数据的细节,而忽略了数据的普遍规律。
欠拟合
欠拟合(Underfitting)就像你在考试时,连基本的知识点都没掌握,所以考试成绩很差。模型在训练数据和新数据上都表现得不好,因为它没有捕捉到数据的规律。
2.3、评估指标
准确率(Accuracy)
准确率是指正确预测的样本数占总样本数的比例。适用于分类任务。
公式:
准确率=正确预测的样本数/总样本数
示例:
假设你有100个样本,正确预测了90个,那么准确率就是90%
精确率(Precision)
精确率是指正确预测的正样本数占预测为正样本数的比例。适用于不均衡数据集。
公式:
精确率=正确预测的正样本数/预测为正样本数
示例:
假设你预测为正样本的50个中有45个是正确的,那么精确率就是90%。
召回率(Recall)
召回率是指正确预测的正样本数占实际正样本数的比例。适用于需要找到所有正样本的情况。
公式:
召回率=正确预测的正样本数/实际正样本数
示例:
假设实际为正样本的60个中有45个是正确的,那么召回率就是75%。
F1-score:
F1-score是精确率和召回率的调和平均数,用于综合评价模型。
公式:𝐹1=2⋅(精确率⋅召回率/(精确率+召回率))
示例:
F1-score综合了精确率和召回率,适用于需要平衡二者的情况
通过这些评估指标,你可以全面了解模型的性能,从而做出更好的调整和优化
(三)经典机器学习算法
3.1、线性回归与逻辑回归
线性回归(Linear Regression):
线性回归是一种用来预测连续值的算法。假设你想预测一个人的工资,你有一个包含多个人的工作经验和工资的数据集。你可以用这个数据集来训练一个模型,让模型学会根据工作经验预测工资。
<code>import numpy as np
from sklearn.linear_model import LinearRegression
# 示例数据:工作经验(年)和工资(单位:千美元)
X = np.array([[1], [2], [3], [4], [5]]) # 工作经验,作为自变量(特征)
y = np.array([30, 35, 40, 50, 60]) # 工资,作为因变量(目标)
# 创建线性回归模型
model = LinearRegression()
model.fit(X, y) # 使用数据拟合模型
# 进行预测
y_pred = model.predict(X)
print(f"预测的工资: {y_pred}")
逻辑回归(Logistic Regression):
逻辑回归尽管名字里有“回归”,实际上是用来做分类的,特别是二分类问题(二分类问题的输出只有两个类别,通常表示为0和1,或者"是"和"否",或者"正"和"负")。比如你想预测一封电子邮件是否是垃圾邮件,逻辑回归可以帮你实现。
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
# 加载数据
iris = load_iris()
X, y = iris.data, iris.target
# 仅使用前两类数据进行二分类
X_binary, y_binary = X[y != 2], y[y != 2]
# 创建逻辑回归模型并训练
model = LogisticRegression()
model.fit(X_binary, y_binary)
# 进行预测
y_pred = model.predict(X_binary)
print(f"逻辑回归预测: {y_pred}")
3.2、决策树与随机森林
决策树(Decision Tree):
决策树就像一棵真正的树,每个分支是一个决策,每个叶子节点是一个最终的结果。你可以用决策树来进行分类或回归。
from sklearn.tree import DecisionTreeClassifier
# 创建决策树模型并训练
model = DecisionTreeClassifier()
model.fit(X_binary, y_binary)
# 进行预测
y_pred = model.predict(X_binary)
print(f"决策树预测: {y_pred}")
随机森林(Random Forest):
随机森林是由多个决策树组成的集成模型。通过结合多个决策树的结果,随机森林通常能取得比单棵决策树更好的效果。
from sklearn.ensemble import RandomForestClassifier
# 创建随机森林模型并训练
model = RandomForestClassifier()
model.fit(X_binary, y_binary)
# 进行预测
y_pred = model.predict(X_binary)
print(f"随机森林预测: {y_pred}")
3.3、支持向量机(SVM)
支持向量机(SVM, Support Vector Machine):
支持向量机通过寻找最佳分割超平面来分类数据。它在处理高维数据时特别有效,比如区分两种不同的花。
from sklearn.svm import SVC
# 创建SVM模型并训练
model = SVC()
model.fit(X_binary, y_binary)
# 进行预测
y_pred = model.predict(X_binary)
print(f"SVM预测: {y_pred}")
3.4、K-近邻算法(KNN)
K-近邻算法(KNN, K-Nearest Neighbors):
KNN算法通过比较新数据点与训练数据点的距离来进行分类或回归。它简单但有效,特别是当数据量不大时。
from sklearn.neighbors import KNeighborsClassifier
# 创建KNN模型并训练
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_binary, y_binary)
# 进行预测
y_pred = model.predict(X_binary)
print(f"KNN预测: {y_pred}")
聚类算法(K-means、层次聚类)
K-means:
K-means算法将数据分成K个聚类,每个数据点属于离它最近的聚类中心。它常用于探索数据的内部结构,比如将客户分成不同的群体。
from sklearn.cluster import KMeans
import numpy as np
# 示例数据:二维数据点
data = np.array([[1, 2], [2, 3], [3, 4], [8, 9], [9, 10], [10, 11]])
# 创建K-means模型
kmeans = KMeans(n_clusters=2)
kmeans.fit(data) # 使用数据拟合模型
# 打印聚类结果
print(f"聚类标签: {kmeans.labels_}")
层次聚类(Hierarchical Clustering):
层次聚类通过构建一棵树来表示数据的层次结构,可以将数据逐层分割成不同的聚类。
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt
# 示例数据
data = np.array([[1, 2], [2, 3], [3, 4], [8, 9], [9, 10], [10, 11]])
# 层次聚类
linked = linkage(data, 'single')
# 绘制树状图
dendrogram(linked, labels=[f'点 {i}' for i in range(len(data))])
plt.show()
(四)简单线性回归
上章节已对线性回归做详细的介绍,本章节再次使用一个简单的例子来说明机器学习的基本步骤。假设我们有一些关于一个省份房子的面积和价格的数据,我们想预测新的房子的价格。
4.1、导入必要的库
import numpy as np # 导入数值计算库
import matplotlib.pyplot as plt # 导入绘图库
from sklearn.model_selection import train_test_split # 导入数据集划分工具
from sklearn.linear_model import LinearRegression # 导入线性回归模型
from sklearn.metrics import mean_squared_error # 导入均方误差计算工具
4.2、准备数据
# 生成一些模拟数据
np.random.seed(0) # 设置随机种子以确保结果可复现
X = 2 * np.random.rand(100, 1) # 生成100个房子面积的随机数据点
y = 6 + 3 * X + np.random.randn(100, 1) # 房子价格(目标值)
# 将数据集分为训练集和测试集
#random_state是确保每次运行时分割结果相同
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
np.random.send(0) 代码解析:
是用来设置 NumPy 的随机数生成器的种子。
简单来说:
就比如一本厚厚的电话簿。你随便打开一页,然后从这一页开始读号码。这本书里有很多号码,但如果你每次都从同一页开始读,你每次读到的号码顺序都是一样的。随机数种子就像告诉计算机“从哪一页开始读”的书签。
设置随机数种子的目的:
在编程中,有时候我们希望每次运行代码时得到相同的随机数序列。这样做可以帮助我们在调试代码或分享结果时确保一致性。
代码实例:
import numpy as np
# 不设置随机数种子
random_numbers_1 = np.random.rand(5)
print("第一次生成的随机数:", random_numbers_1)
# 再次生成随机数,没有设置种子
random_numbers_2 = np.random.rand(5)
print("第二次生成的随机数:", random_numbers_2)
# 设置随机数种子为0
np.random.seed(0)
random_numbers_3 = np.random.rand(5)
print("设置种子为0生成的随机数:", random_numbers_3)
# 再次设置相同的随机数种子为0
np.random.seed(0)
random_numbers_4 = np.random.rand(5)
print("再次设置种子为0生成的随机数:", random_numbers_4)
运行结果:
第一次生成的随机数: [0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
第二次生成的随机数: [0.64589411 0.43758721 0.891773 0.96366276 0.38344152]
设置种子为0生成的随机数: [0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
再次设置种子为0生成的随机数: [0.5488135 0.71518937 0.60276338 0.54488318 0.4236548 ]
np.random.rand(100, 1) 代码解释:
将生成一个形状为 的二维数组,其中包含100个随机数,每个随机数在 [0, 1) 范围内。输出结果为一个100行1列的二维数组。(上章节已经提到,在某些机器学习算法(如线性回归)中,输入数据通常被要求是二维数组)
以下为输出结果:
import numpy as np
# 生成一个形状为 (10, 1) 的二维数组,包含10个随机数,每个随机数在 [0, 1) 范围内
random_numbers = np.random.rand(10, 1)
print(random_numbers)
输出结果:
[[0.41919451]
[0.6852195 ]
[0.20445225]
[0.87811744]
[0.02738759]
[0.67046751]
[0.4173048 ]
[0.55868983]
[0.14038694]
[0.19810149]]
np.random.rand生成随机数常用常用函数库:
np.random.randint 可以生成指定范围内的随机整数
np.random.randn 可以生成负数,并且数值会围绕 0 分布
np.random.rand 生成 [0, 1) 范围内的均匀分布的随机数。
4.3、训练模型
# 创建线性回归模型实例
lin_reg = LinearRegression()
# 用训练集数据训练模型
lin_reg.fit(X_train, y_train)
4.4、做出预测
# 用测试集数据做出预测
#y_pred为预测出结果
y_pred = lin_reg.predict(X_test)
4.5、评估模型
# 计算均方误差
mse = mean_squared_error(y_test, y_pred)
print(f"均方误差: {mse}")
均方误差(Mean Squared Error, MSE)是一个常用的评价回归模型预测效果的指标。它量化了预测值与实际值之间的差异。均方误差越小,表示模型的预测结果与实际值越接近。
4.6、可视化结果
# 绘制数据点和预测线
plt.scatter(X, y, color='blue', label='数据点')code>
plt.plot(X_test, y_pred, color='red', label='预测线')code>
plt.xlabel('房子面积')
plt.ylabel('房子价格')
plt.legend()
plt.show()
可视化结果展示:
(五)总结
通过线性回归简单的例子,我们介绍了机器学习的基本步骤:准备数据、训练模型、做出预测和评估模型,可进一步深入了解机器学习。
声明
本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。