随着人工智能的快速发展,机器学习已经成为很多领域的核心技术。无论是在学术研究还是工业应用中,我们都会经常遇到两个非常流行的工具:PyTorch 和 scikit-learn。它们在机器学习领域各有千秋,适用于不同的任务和需求。今天,我们就来简单聊聊这两个工具的应用场景和各自的特点。
PyTorch 和 scikit-learn 简介
PyTorch 是由 Facebook 的人工智能团队开发的一个深度学习框架。它最大的特点是灵活和简单易用,特别适合那些需要动态调整模型结构的深度学习任务。它在图像识别、自然语言处理等复杂任务中有着广泛的应用。
使用 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()
代码解释:
我们从 torchvision
库中加载了 MNIST 数据集。构建了一个简单的两层全连接神经网络,作为我们的分类器。 使用交叉熵损失函数和随机梯度下降优化器进行模型训练。 最后,我们通过可视化展示了模型对部分测试图片的预测结果。
scikit-learn 示例:鸢尾花分类
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()
代码解释:
通过 scikit-learn 自带的工具加载了 Iris 数据集。 将数据集分为训练集和测试集,并使用 KNN 算法进行训练。 评估模型的精度,展示分类效果。 使用主成分分析(PCA)将数据降维到二维,以便更好地可视化分类结果。