用代码和实战讲解机器学习,零基础一样看得懂👏🏻👏🏻👏🏻
复习、学习、备战考试皆可用👏🏻👏🏻👏🏻
本系列持续更新中,三连关注不迷路👌🏻
干货满满不看后悔👍👍👍
📝个人主页→数据挖掘博主ZTLJQ的主页
个人推荐python学习系列:
☄️爬虫JS逆向系列专栏 - 爬虫逆向教学
☄️python系列专栏 - 从零开始学python
☀️1. 机器学习基础
⛅️ 1.1 监督学习
在机器学习中,监督学习是一种常见且重要的学习方式。它通过训练数据集中的输入特征和对应的标签,构建一个模型来预测未知数据的标签。
1.概述
监督学习是一种通过从已知数据中学习规律,从而对未知数据进行预测的学习方法。其基本思想是利用训练集中的输入特征和已知标签之间的关系来构建一个模型,然后使用该模型对新的数据进行标签预测。
2.常见算法
以下是监督学习中常见的算法:
2.1 线性回归
线性回归是一种用于建立连续值输出的模型的监督学习算法。它通过拟合一个线性函数来预测目标变量。下面是一个简单的线性回归的示例代码:
import numpy as np
from sklearn.linear_model import LinearRegression
# 构造训练集
X_train = np.array([[1], [2], [3], [4], [5]])
y_train = np.array([2, 4, 6, 8, 10])
# 创建线性回归模型并拟合数据
model = LinearRegression()
model.fit(X_train, y_train)
# 对新数据进行预测
X_new = np.array([[6]])
y_pred = model.predict(X_new)
print("预测结果:", y_pred)
2.2 决策树
决策树是一种基于树形结构进行决策的监督学习算法。它通过从根节点开始根据特征进行分割,逐步构建一个决策树模型。下面是一个简单的决策树的示例代码:
from sklearn.tree import DecisionTreeClassifier
# 构造训练集
X_train = [[5.1, 3.5, 1.4, 0.2], [4.9, 3.0, 1.4, 0.2], [6.2, 3.4, 5.4, 2.3], [5.9, 3.0, 5.1, 1.8]]
y_train = [0, 0, 1, 1]
# 创建决策树分类器并拟合数据
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
# 对新数据进行预测
X_new = [[6.5, 3.0, 5.2, 2.0]]
y_pred = model.predict(X_new)
print("预测结果:", y_pred)
K最近邻算法是一种基于实例的学习方法,它根据最近邻的样本来进行预测。
from sklearn.neighbors import KNeighborsClassifier
# 构造训练集
X_train = [[3, 1.5], [2, 1], [4, 1.5], [3, 1], [3.5, 0.5], [2, 0.5], [5.5, 1], [1, 1], [4.5, 1]]
y_train = ['orange', 'orange', 'orange', 'orange', 'apple', 'apple', 'apple', 'apple', 'orange']
# 创建K最近邻分类器并拟合数据
model = KNeighborsClassifier(n_neighbors=3)
model.fit(X_train, y_train)
# 对新数据进行预测
X_new = [[2.9, 1.2]]
y_pred = model.predict(X_new)
print("预测结果:", y_pred)
⛅️ 1.2 无监督学习
概述:
无监督学习是机器学习中的一个重要分支,它关注的是从未标记的数据中发现有用的信息。相比有监督学习,无监督学习更具挑战性,因为在无监督学习中,我们没有预先标记的输出来指导模型的学习过程。无监督学习的主要任务包括聚类、降维和关联规则挖掘等。
聚类算法:
聚类是无监督学习中最常用的任务之一,它旨在将数据分成不同的组,每个组内的数据在某种意义上是相似的。常见的聚类算法包括K-Means、层次聚类和DBSCAN。我们以K-Means算法为例进行代码实战。
K-Means算法原理
K-Means算法是一种迭代算法,其基本思想是将数据集分为K个簇,每个簇代表一个聚类中心,使得簇内的数据点到其所属聚类中心的距离最小。算法步骤如下:
- 随机选择K个数据点作为初始聚类中心。
- 将每个数据点分配到距离其最近的聚类中心所在的簇。
- 更新每个簇的聚类中心为簇内所有数据点的均值。
- 重复步骤2和步骤3,直到聚类中心不再变化或达到最大迭代次数。
K-Means算法代码实战
下面是使用Python实现的K-Means算法示例代码:
# 导入必要的库
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
# 生成示例数据
np.random.seed(0)
X = np.random.rand(100, 2)
# 使用K-Means算法进行聚类
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], marker='x', color='red')
plt.title('K-Means Clustering')
plt.xlabel('X')
plt.ylabel('Y')
plt.show()
#运行以上代码,我们可以得到一个可视化的聚类结果图。
#图中的数据点被分为了三个簇,并且每个簇的聚类中心用红色的叉标注。
降维技术
降维是无监督学习中的另一个重要任务,它的目标是减少数据的维度,同时保留尽可能多的信息。降维技术有助于可视化高维数据、减少计算复杂度和去除冗余特征等。常见的降维算法包括主成分分析(PCA)和t-SNE算法。
关联规则挖掘
关联规则挖掘是无监督学习的另一个领域,它旨在从大规模数据集中发现项集之间的关联关系。关联规则挖掘在市场分析、推荐系统等领域有着广泛的应用。其中,Apriori算法是最常用的关联规则挖掘算法之一。
⛅️1.3 半监督学习
概述:
半监督学习是介于有监督学习和无监督学习之间的一种学习范式。它通过同时利用有标记数据和未标记数据来训练模型。在实际应用中,往往有大量未标记的数据,而标记数据的获取成本较高,因此半监督学习可以充分利用未标记数据来提升模型性能。
半监督学习算法:
半监督学习算法包括基于图的方法、生成模型和半监督支持向量机等。下面我们将以标签传播算法为例进行详细讲解和代码实战。
标签传播算法原理
标签传播算法是一种基于图的半监督学习算法。它基于数据的相似性来传播标记信息,通过迭代的方式逐步更新未标记数据点的标记。算法的基本步骤如下:
- 构建图:根据数据的相似性构建一个图,其中数据点作为图的节点,相似性作为节点之间的边。
- 初始化标记:将有标记的数据点标记为其真实标签,未标记的数据点用虚拟标签表示。
- 标签传播:通过迭代地更新节点的标签来传播标记信息,每个节点的标签由其邻居节点的标签加权得到。
- 收敛判断:当标签传播过程收敛或达到最大迭代次数时停止。
标签传播算法代码实战
下面是使用Python实现的标签传播算法示例代码:
# 导入必要的库
import numpy as np
from sklearn.datasets import make_moons
from sklearn.semi_supervised import LabelPropagation
import matplotlib.pyplot as plt
# 生成示例数据
np.random.seed(0)
X, y = make_moons(n_samples=200, noise=0.05)
# 设置部分数据标记
n_labeled = 10
labels = np.array([-1] * len(X))
labels[:n_labeled] = y[:n_labeled]
# 使用标签传播算法进行半监督学习
label_prop = LabelPropagation(kernel='knn', n_neighbors=10)
label_prop.fit(X, labels)
# 可视化结果
plt.scatter(X[:, 0], X[:, 1], c=label_prop.labels_, cmap='viridis')
plt.title('Label Propagation')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
#运行以上代码,我们可以得到一个可视化的结果图。
#图中的数据点被分为不同的颜色,表示其被标记的类别。
#标签传播算法通过利用未标记数据点的相似性来传播标记信息,从而实现了半监督学习。
⛅️1.4 强化学习
概述
强化学习是一种通过智能决策者与环境的交互学习最优策略的学习方法。智能决策者通过观察环境的状态,执行动作,并接收奖励或惩罚来调整策略。强化学习的目标是使智能决策者在与环境的交互中获得最大的累积奖励。
强化学习的要素
强化学习包含以下主要要素:
- 状态(State):描述环境的特征或观测。
- 动作(Action):智能决策者在给定状态下可执行的操作。
- 奖励(Reward):智能决策者在执行动作后,根据环境的反馈获得的奖励或惩罚。
- 策略(Policy):智能决策者选择动作的方式或规则。
- 值函数(Value Function):评估在给定策略下,智能决策者在不同状态下获得的长期回报。
- Q值函数(Q-Value Function):评估在给定策略下,智能决策者在给定状态和动作下获得的长期回报。
强化学习算法
强化学习算法包括基于值函数的方法和基于策略的方法。其中,著名的算法包括Q-Learning、SARSA和深度强化学习(Deep Reinforcement Learning)等。我们将以Q-Learning算法为例进行详细讲解和代码实战。
Q-Learning算法原理
Q-Learning算法是一种基于值函数的强化学习算法。它通过学习一个Q值函数来估计在给定状态和动作下的长期回报。算法的基本步骤如下:
- 初始化Q值函数为一个随机值。
- 在每个时间步骤中,智能决策者观察当前状态,并基于某个策略选择一个动作。
- 执行选定的动作,观察环境的反馈,包括奖励和下一个状态。
- 更新Q值函数,以便更好地估计长期回报。
- 重复步骤2至4,直到达到指定的停止条件。
Q-Learning算法代码实战
下面是使用Python实现的Q-Learning算法示例代码:
# 导入必要的库
import numpy as np
# 定义环境和参数
num_states = 6
num_actions = 2
epsilon = 0.2
alpha = 0.5
gamma = 0.9
# 初始化Q值函数
Q = np.zeros((num_states, num_actions))
# Q-Learning算法
for episode in range(100):
state = 0 # 初始状态
while state != num_states - 1:
# 选择动作
if np.random.uniform() < epsilon:
action = np.random.randint(num_actions)
else:
action = np.argmax(Q[state])
# 执行动作并观察环境反馈
if action == 0:
reward = -1
next_state = state - 1
else:
reward = 1
next_state = state + 1
# 更新Q值函数
Q[state, action] += alpha * (reward + gamma * np.max(Q[next_state]) - Q[state, action])
state = next_state
# 打印学习后的Q值函数
print("Learned Q-Values:")
print(Q)
#运行以上代码,我们可以得到学习后的Q值函数。
#Q值函数将状态和动作对应的长期回报进行了估计,智能决策者可以通过查询Q值函数来选择最优的动作。
⛅️1.5 迁移学习
概述
迁移学习是一种通过将先前学习任务中获得的知识迁移到新任务中的学习方法。它基于这样的观点:在不同任务之间存在一定的相关性,先前学习任务中获得的知识可以帮助新任务的学习过程。迁移学习的目标是提高新任务的学习性能、加速学习过程或改善模型的泛化能力。
迁移学习的关键要素
迁移学习包含以下主要要素:
- 源领域(Source Domain):先前学习任务中的数据和特征。
- 源任务(Source Task):先前学习任务的目标。
- 目标领域(Target Domain):新任务中的数据和特征。
- 目标任务(Target Task):新任务的目标。
- 迁移方法(Transfer Method):将源领域中的知识应用于目标领域的方法。
迁移学习算法
迁移学习算法可以分为基于实例的方法、基于特征的方法和基于模型的方法等。其中,著名的算法包括领域自适应(Domain Adaptation)、预训练模型(Pretrained Models)和多任务学习(Multi-Task Learning)等。我们将以预训练模型为例进行详细讲解和代码实战。
预训练模型原理
预训练模型是一种基于模型的迁移学习方法。它通过在大规模数据上进行预训练,学习通用的特征表示,并将这些特征迁移到新任务中。常用的预训练模型包括BERT、GPT和ResNet等。算法的基本步骤如下:
- 在大规模数据上进行预训练,学习通用的特征表示。
- 冻结预训练模型的参数。
- 在新任务的数据上进行微调,只更新新任务的特定层或添加新的分类层。
- 使用微调后的模型进行预测和评估。
预训练模型代码实战
下面是使用Python和PyTorch实现预训练模型的示例代码:
# 导入必要的库
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.models as models
import torchvision.transforms as transforms
import torchvision.datasets as datasets
# 加载预训练模型
model = models.resnet18(pretrained=True)
# 冻结预训练模型的参数
for param in model.parameters():
param.requires_grad = False
# 替换最后一层分类器
num_classes = 10
model.fc = nn.Linear(model.fc.in_features, num_classes)
# 加载新任务的数据
train_dataset = datasets.CIFAR10(root='./data', train=True, download=True, transform=transforms.ToTensor())
test_dataset = datasets.CIFAR10(root='./data', train=False, download=True, transform=transforms.ToTensor())
# 定义优化器和损失函数
optimizer = optim.SGD(model.fc.parameters(), lr=0.001, momentum=0.9)
criterion = nn.CrossEntropyLoss()
# 定义训练和测试函数
def train(model, train_loader, criterion, optimizer):
model.train()
for images, labels in train_loader:
optimizer.zero_grad()
outputs = model(images)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
def test(model, test_loader):
model.eval()
correct = 0
total = 0
with torch.no_grad():
for images, labels in test_loader:
outputs = model(images)
_, predicted = torch.max(outputs.data, 1)
total += labels.size(0)
correct += (predicted == labels).sum().item()
accuracy = 100.0 * correct / total
return accuracy
# 加载数据并进行训练和测试
batch_size = 64
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=batch_size, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=batch_size, shuffle=False)
# 进行训练和测试
num_epochs = 10
for epoch in range(num_epochs):
train(model, train_loader, criterion, optimizer)
accuracy = test(model, test_loader)
print('Epoch: {}, Accuracy: {:.2f}%'.format(epoch+1, accuracy))
#运行以上代码,我们可以使用预训练的ResNet模型在CIFAR-10数据集上进行微调和测试。
#预训练模型学习到的通用特征表示可以帮助模型更快地收敛,并在新任务上获得更好的性能。
⛅️1.6 集成学习
概述
集成学习是一种组合多个机器学习模型的技术,旨在提高整体性能。它通过整合多个模型的预测结果,利用模型之间的差异性来减少误差、增强泛化能力,并提高对未知数据的预测准确性。常见的集成学习方法包括投票法(Voting)、平均法(Averaging)、堆叠法(Stacking)和Boosting等。
集成学习的关键要素
集成学习包含以下主要要素:
- 基础学习器(Base Learners):组成集成模型的个体学习器。
- 集成策略(Ensemble Strategy):定义如何整合基础学习器的预测结果。
- 学习器的多样性(Diversity of Learners):保证基础学习器之间的差异性。
集成学习算法
集成学习算法可以分为平均法、投票法、堆叠法和Boosting等。我们将以随机森林为例进行详细讲解和代码实战。
随机森林原理
随机森林是一种基于决策树的集成学习方法。它通过构建多个决策树并整合它们的预测结果来进行分类或回归。随机森林的基本步骤如下:
- 从原始数据集中随机选择一部分样本,构建决策树。
- 重复步骤1多次,得到一组决策树。
- 对于分类任务,通过投票法确定最终的类别;对于回归任务,通过平均法确定最终的预测值。
随机森林代码实战
下面是使用Python和Scikit-learn实现随机森林的示例代码:
# 导入必要的库
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# 加载数据集
iris = load_iris()
X, y = iris.data, iris.target
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 构建随机森林模型
rf = RandomForestClassifier(n_estimators=100, random_state=42)
# 拟合模型
rf.fit(X_train, y_train)
# 预测
y_pred = rf.predict(X_test)
# 评估准确率
accuracy = accuracy_score(y_test, y_pred)
print('Accuracy: {:.2f}%'.format(accuracy * 100))
#运行以上代码,我们可以使用随机森林模型对鸢尾花数据集进行分类。
#随机森林通过构建多个决策树并整合它们的预测结果来提高分类准确率。