审稿人:你为什么不用PyTorch包做机器学习?

文摘   2024-09-01 08:00   荷兰  

随着人工智能的快速发展,机器学习已经成为很多领域的核心技术。无论是在学术研究还是工业应用中,我们都会经常遇到两个非常流行的工具:PyTorch 和 scikit-learn它们在机器学习领域各有千秋,适用于不同的任务和需求。今天,我们就来简单聊聊这两个工具的应用场景和各自的特点。

PyTorch 和 scikit-learn 简介

PyTorch 是由 Facebook 的人工智能团队开发的一个深度学习框架。它最大的特点是灵活和简单易用,特别适合那些需要动态调整模型结构的深度学习任务。它在图像识别、自然语言处理等复杂任务中有着广泛的应用。

scikit-learn 则是一个基于 Python 的传统机器学习库。它包含了大量常用的机器学习算法,比如逻辑回归、决策树、K-近邻(KNN)等。scikit-learn 使用简单,接口友好,非常适合用于快速构建和测试模型,特别是对于中小规模的数据和问题。

使用 PyTorch 进行简单的二分类任务

我们将使用 PyTorch 生成一些随机数据来进行一个简单的二分类任务,并展示如何定义模型、训练模型以及进行可视化。
import torch
import torch.nn as nn
import torch.optim as optim
import matplotlib.pyplot as plt

# 生成随机数据:100个样本,每个样本有2个特征
# 前50个样本的标签为0,后50个样本的标签为1
torch.manual_seed(0)
n_samples = 100
x = torch.randn(n_samples, 2)
y = torch.cat((torch.zeros(n_samples // 2), torch.ones(n_samples // 2)))

# 定义简单的神经网络
class SimpleNN(nn.Module):
def __init__(self):
super(SimpleNN, self).__init__()
self.fc = nn.Linear(2, 1) # 2个输入特征,1个输出

def forward(self, x):
x = self.fc(x)
return torch.sigmoid(x)

# 初始化模型、损失函数和优化器
model = SimpleNN()
criterion = nn.BCELoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)

# 训练模型
for epoch in range(100):
optimizer.zero_grad()
outputs = model(x)
loss = criterion(outputs.view(-1), y)
loss.backward()
optimizer.step()

# 输出最后一个epoch的损失
print(f'Final Loss: {loss.item():.4f}')

# 可视化数据和分类边界
plt.scatter(x[:50, 0], x[:50, 1], color='red', label='Class 0')
plt.scatter(x[50:, 0], x[50:, 1], color='blue', label='Class 1')

# 绘制分类边界
x_boundary = torch.linspace(-3, 3, 100).unsqueeze(1)
y_boundary = -(model.fc.weight[0, 0] * x_boundary + model.fc.bias[0]) / model.fc.weight[0, 1]
plt.plot(x_boundary.numpy(), y_boundary.detach().numpy(), 'k--')

plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.title('Data and Decision Boundary')
plt.show()

代码解释:

  1. 我们从 torchvision 库中加载了 MNIST 数据集。
  2. 构建了一个简单的两层全连接神经网络,作为我们的分类器。
  3. 使用交叉熵损失函数和随机梯度下降优化器进行模型训练。
  4. 最后,我们通过可视化展示了模型对部分测试图片的预测结果。

scikit-learn 示例:鸢尾花分类

接下来,我们用 scikit-learn 实现一个简单的分类任务。我们会使用经典的鸢尾花(Iris)数据集,并使用 K-近邻(KNN)算法进行分类。
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score
from sklearn.decomposition import PCA

# 加载Iris数据集
iris = datasets.load_iris()
X, y = iris.data, iris.target

# 数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 定义KNN分类器
knn = KNeighborsClassifier(n_neighbors=3)

# 训练KNN分类器
knn.fit(X_train, y_train)
# 在测试集上进行预测
y_pred = knn.predict(X_test)

# 计算并输出精度
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
## Accuracy: 1.00
# 使用PCA进行降维,仅用于可视化
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

# 绘制降维后的数据
plt.figure(figsize=(8, 6))
colors = ['red', 'green', 'blue']
for i in range(3):
idx = y == i
plt.scatter(X_pca[idx, 0], X_pca[idx, 1], c=colors[i], label=iris.target_names[i])
plt.xlabel('PCA Component 1')
plt.ylabel('PCA Component 2')
plt.legend()
plt.title('Iris dataset with KNN classification')
plt.show()

代码解释:

  1. 通过 scikit-learn 自带的工具加载了 Iris 数据集。
  2. 将数据集分为训练集和测试集,并使用 KNN 算法进行训练。
  3. 评估模型的精度,展示分类效果。
  4. 使用主成分分析(PCA)将数据降维到二维,以便更好地可视化分类结果。

总结

PyTorch 和 scikit-learn 是机器学习领域两个非常有用的工具。PyTorch 更适合处理复杂的深度学习任务,具有高度的灵活性和强大的 GPU 支持。而 scikit-learn 则擅长于传统的机器学习任务,提供了丰富的算法和简单的使用接口。根据你的具体需求和任务特点,选择合适的工具可以大大提高工作效率。
无论你是刚刚入门的初学者,还是有一定经验的开发者,这两个工具都值得深入学习和使用。希望通过这篇文章,大家能够对 PyTorch 和 scikit-learn 有一个更清晰的认识,在未来的项目中更好地应用它们!


感谢关注!

科研代码
专注R和Python的数据分析。
 最新文章