(四)人工智能之机器学习

淘金铲 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()

 可视化结果展示:

 (五)总结

通过线性回归简单的例子,我们介绍了机器学习的基本步骤:准备数据、训练模型、做出预测和评估模型,可进一步深入了解机器学习。



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。