哈喽,我是Johngo~
这几天,在社群发现很多同学都在讨论使用哪个框架的问题。
当然,主要还是围绕TensorFlow和Pytorch展开。
也毫无疑问,Pytorch的同学以压倒性的话语权霸屏。其实无论使用哪种框架,适合自己适合项目是最合适的。
除此之外呢,还介绍了 sklearn、Keras、xgboost、LightGBM、NLTK、Gensim、Statsmodels、Caffe。
老规矩:大家伙如果觉得近期文章还不错!欢迎大家点个赞、转个发~
关于机器学习和深度学习,这里再简单叙述一下~
机器学习的核心思想是通过数据训练模型,然后使用这个模型进行预测或分类。常见的机器学习算法包括线性回归、决策树、支持向量机和聚类算法等。
深度学习是机器学习的一个子领域,它主要利用神经网络,尤其是深层神经网络来进行数据分析和模式识别。深度学习的灵感来源于人脑的结构,通过多层神经元的连接和激活函数,深度学习能够自动学习和提取数据中的特征,从而在图像识别、自然语言处理等任务上表现出色。
使用这些库不仅简化了模型的开发过程,还为大家提供了强大的工具和资源。
下面,我通过具体的代码示例,深入了解这些库的使用方法和应用场景,帮助对于某一个库的初学者更好地掌握机器学习和深度学习的相关库的使用~
好了,一起来看看~
1. TensorFlow
开发者: Google Brain
详细介绍: TensorFlow是一个开源的机器学习框架,由Google Brain团队开发并在2015年发布。它提供了灵活的计算模型,支持大规模分布式训练和跨平台部署,适用于从研究到生产的各种场景。
特点:
- 支持分布式计算,能在多GPU和TPU上高效运行。
- 拥有丰富的预训练模型和工具,如TensorFlow Hub和TensorFlow Model Garden。
- 强大的社区支持和广泛的文档资源。
- 兼容Keras,提供高层API简化深度学习模型的构建和训练。
适用场景:
- 大规模深度学习模型训练和部署。
- 需要跨平台支持的机器学习应用,如移动设备和Web应用。
- 工业级应用和生产环境中的AI解决方案。
经典案例: 使用TensorFlow构建并训练一个简单的神经网络进行手写数字识别(MNIST数据集)。
import tensorflow as tf | |
from tensorflow.keras.datasets import mnist | |
from tensorflow.keras.models import Sequential | |
from tensorflow.keras.layers import Dense, Flatten | |
import matplotlib.pyplot as plt | |
# 加载数据 | |
(x_train, y_train), (x_test, y_test) = mnist.load_data() | |
x_train, x_test = x_train / 255.0, x_test / 255.0 | |
# 构建模型 | |
model = Sequential([ | |
Flatten(input_shape=(28, 28)), | |
Dense(128, activation='relu'), | |
Dense(10, activation='softmax') | |
]) | |
# 编译模型 | |
model.compile(optimizer='adam', | |
loss='sparse_categorical_crossentropy', | |
metrics=['accuracy']) | |
# 训练模型 | |
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test)) | |
# 绘制训练结果 | |
plt.plot(history.history['accuracy'], label='accuracy') | |
plt.plot(history.history['val_accuracy'], label = 'val_accuracy') | |
plt.xlabel('Epoch') | |
plt.ylabel('Accuracy') | |
plt.ylim([0.5, 1]) | |
plt.legend(loc='lower right') | |
plt.show() | |
# 评估模型 | |
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2) | |
print('\nTest accuracy:', test_acc) | |
# Test accuracy: 0.9751999974250793 |
2. PyTorch
开发者: Facebook's AI Research lab (FAIR)
详细介绍: PyTorch是一个开源深度学习框架,由Facebook的人工智能研究实验室开发。它于2016年发布,以其动态计算图和易用性而广受欢迎,尤其在研究社区中。
特点:
- 动态计算图(Define-by-Run),调试方便,灵活性高。
- 广泛的社区支持和丰富的资源,如PyTorch Hub。
- 强大的支持库,如TorchVision(计算机视觉)和TorchText(自然语言处理)。
- 与ONNX(Open Neural Network Exchange)兼容,便于模型导出和跨平台部署。
适用场景:
- 学术研究和快速原型开发。
- 需要动态计算图和灵活调试的深度学习项目。
- 计算机视觉和自然语言处理任务。
经典案例: 使用PyTorch构建并训练一个简单的神经网络进行手写数字识别(MNIST数据集)。
import torch | |
import torch.nn as nn | |
import torch.optim as optim | |
from torchvision import datasets, transforms | |
import matplotlib.pyplot as plt | |
# 数据加载和预处理 | |
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) | |
trainset = datasets.MNIST(root='./data', train=True, download=True, transform=transform) | |
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True) | |
testset = datasets.MNIST(root='./data', train=False, download=True, transform=transform) | |
testloader = torch.utils.data.DataLoader(testset, batch_size=64, shuffle=False) | |
# 定义模型 | |
class Net(nn.Module): | |
def __init__(self): | |
super(Net, self).__init__() | |
self.fc1 = nn.Linear(28 * 28, 128) | |
self.fc2 = nn.Linear(128, 10) | |
def forward(self, x): | |
x = x.view(-1, 28 * 28) | |
x = torch.relu(self.fc1(x)) | |
x = self.fc2(x) | |
return x | |
model = Net() | |
# 定义损失函数和优化器 | |
criterion = nn.CrossEntropyLoss() | |
optimizer = optim.Adam(model.parameters(), lr=0.001) | |
# 训练模型 | |
epochs = 5 | |
train_losses = [] | |
for epoch in range(epochs): | |
running_loss = 0.0 | |
for images, labels in trainloader: | |
optimizer.zero_grad() | |
outputs = model(images) | |
loss = criterion(outputs, labels) | |
loss.backward() | |
optimizer.step() | |
running_loss += loss.item() | |
train_losses.append(running_loss / len(trainloader)) | |
# 绘制训练损失 | |
plt.plot(train_losses, label='Training loss') | |
plt.xlabel('Epoch') | |
plt.ylabel('Loss') | |
plt.legend(loc='upper right') | |
plt.show() | |
# 评估模型 | |
correct = 0 | |
total = 0 | |
with torch.no_grad(): | |
for images, labels in testloader: | |
outputs = model(images) | |
_, predicted = torch.max(outputs.data, 1) | |
total += labels.size(0) | |
correct += (predicted == labels).sum().item() | |
print('Accuracy of the network on the 10000 test images: %d %%' % (100 * correct / total)) |
3. Scikit-learn
开发者: 社区开发
详细介绍: Scikit-learn是一个基于Python的机器学习库,构建在NumPy、SciPy和matplotlib之上。它提供了简单且一致的API,适用于经典机器学习算法。
特点:
- 覆盖广泛的机器学习算法,如回归、分类、聚类、降维等。
- 简单易用的API设计,适合初学者和快速开发。
- 与Python生态系统中的其他库(如Pandas、NumPy)无缝集成。
- 丰富的文档和教程,社区活跃。
适用场景:
- 中小型数据集的机器学习任务。
- 快速原型和教学用途。
- 需要标准机器学习算法的各种应用。
经典案例: 使用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.preprocessing import StandardScaler | |
from sklearn.svm import SVC | |
from sklearn.decomposition import PCA | |
# 加载数据 | |
iris = datasets.load_iris() | |
X = iris.data | |
y = iris.target | |
# 数据预处理 | |
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) | |
scaler = StandardScaler() | |
X_train = scaler.fit_transform(X_train) | |
X_test = scaler.transform(X_test) | |
# PCA降维 | |
pca = PCA(n_components=2) | |
X_train_pca = pca.fit_transform(X_train) | |
X_test_pca = pca.transform(X_test) | |
# 训练模型 | |
svm = SVC(kernel='linear') | |
svm.fit(X_train_pca, y_train) | |
# 绘制决策边界 | |
def plot_decision_boundary(model, X, y): | |
h = .02 | |
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 | |
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 | |
xx, yy = np.meshgrid(np.arange(x_min, x_max, h), | |
np.arange(y_min, y_max, h)) | |
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]) | |
Z = Z.reshape(xx.shape) | |
plt.contourf(xx, yy, Z, alpha=0.8) | |
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o') | |
plt.xlabel('PCA Component 1') | |
plt.ylabel('PCA Component 2') | |
plt.title('Decision Boundary') | |
plt.show() | |
plot_decision_boundary(svm, X_test_pca, y_test) |
4. Keras
开发者: François Chollet
详细介绍: Keras是一个高层神经网络API,最初由François Chollet开发。它提供简洁易用的接口,能够以模块化和可扩展的方式构建和训练深度学习模型。
特点:
- 简单易用,极大简化了深度学习模型的构建过程。
- 支持多种后端(如TensorFlow、Theano、CNTK)。
- 丰富的预训练模型和工具。
- 强大的社区和文档支持。
适用场景:
- 快速原型开发和实验。
- 教学和初学者学习深度学习。
- 需要高效开发和部署的深度学习应用。
经典案例: 使用Keras构建并训练一个简单的卷积神经网络进行手写数字识别(MNIST数据集)。
from tensorflow.keras.datasets import mnist | |
from tensorflow.keras.models import Sequential | |
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense | |
import matplotlib.pyplot as plt | |
# 加载数据 | |
(x_train, y_train), (x_test, y_test) = mnist.load_data() | |
x_train, x_test = x_train / 255.0, x_test / 255.0 | |
x_train = x_train.reshape(-1, 28, 28, 1) | |
x_test = x_test.reshape(-1, 28, 28, 1) | |
# 构建模型 | |
model = Sequential([ | |
Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)), | |
MaxPooling2D(pool_size=(2, 2)), | |
Flatten(), | |
Dense(128, activation='relu'), | |
Dense(10, activation='softmax') | |
]) | |
# 编译模型 | |
model.compile(optimizer='adam', | |
loss='sparse_categorical_crossentropy', | |
metrics=['accuracy']) | |
# 训练模型 | |
history = model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test)) | |
# 绘制训练结果 | |
plt.plot(history.history['accuracy'], label='accuracy') | |
plt.plot(history.history['val_accuracy'], label = 'val_accuracy') | |
plt.xlabel('Epoch') | |
plt.ylabel('Accuracy') | |
plt.ylim([0.5, 1]) | |
plt.legend(loc='lower right') | |
plt.show() | |
# 评估模型 | |
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2) | |
print('\nTest accuracy:', test_acc) |
5. XGBoost
开发者: Tianqi Chen
详细介绍: XGBoost(eXtreme Gradient Boosting)是一个优化的分布式梯度提升库,由Tianqi Chen开发。它在各类比赛和实际应用中表现优异,常用于处理结构化数据。
特点:
- 高效的梯度提升算法,性能优异。
- 支持分布式训练和大规模数据处理。
- 灵活的调参和模型解释工具。
- 广泛应用于各种机器学习竞赛中。
适用场景:
- 结构化数据的分类和回归任务。
- 各种机器学习竞赛。
- 大规模数据集的处理和分析。
经典案例: 使用XGBoost进行房价预测,并绘制特征重要性图。
import xgboost as xgb | |
from xgboost import plot_importance | |
from sklearn.datasets import load_boston | |
from sklearn.model_selection import train_test_split | |
from sklearn.metrics import mean_squared_error | |
import matplotlib.pyplot as plt | |
# 加载数据 | |
boston = load_boston() | |
X = boston.data | |
y = boston.target | |
# 数据拆分 | |
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) | |
# 训练模型 | |
model = xgb.XGBRegressor(objective ='reg:squarederror', n_estimators=100) | |
model.fit(X_train, y_train) | |
# 预测 | |
y_pred = model.predict(X_test) | |
mse = mean_squared_error(y_test, y_pred) | |
print(f'Mean Squared Error: {mse}') | |
# 绘制特征重要性 | |
plot_importance(model) | |
plt.show() |
6. LightGBM
开发者: Microsoft
详细介绍: LightGBM(Light Gradient Boosting Machine)是一个基于梯度提升的高效框架,由Microsoft开发。它针对大规模数据和分布式训练进行了优化。
特点:
- 高效的梯度提升框架,速度快,内存使用少。
- 支持类别特征处理和分布式训练。
- 丰富的调参选项和模型解释工具。
- 社区支持和文档资源充足。
适用场景:
- 需要高性能和高效计算的机器学习任务。
- 大规模数据集的分类和回归任务。
- 需要快速迭代和调参的项目。
经典案例: 使用LightGBM进行分类任务,并绘制特征重要性图。
import lightgbm as lgb | |
from sklearn.datasets import load_breast_cancer | |
from sklearn.model_selection import train_test_split | |
from sklearn.metrics import accuracy_score | |
import matplotlib.pyplot as plt | |
# 加载数据 | |
data = load_breast_cancer() | |
X = data.data | |
y = data.target | |
# 数据拆分 | |
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) | |
# 创建数据集 | |
train_data = lgb.Dataset(X_train, label=y_train) | |
test_data = lgb.Dataset(X_test, label=y_test) | |
# 参数设置 | |
params = { | |
'objective': 'binary', | |
'metric': 'binary_error', | |
'boosting_type': 'gbdt', | |
'num_leaves': 31, | |
'learning_rate': 0.05, | |
'feature_fraction': 0.9 | |
} | |
# 训练模型 | |
bst = lgb.train(params, train_data, 100, valid_sets=[test_data], early_stopping_rounds=10) | |
# 预测 | |
y_pred = bst.predict(X_test, num_iteration=bst.best_iteration) | |
y_pred = (y_pred > 0.5).astype(int) | |
accuracy = accuracy_score(y_test, y_pred) | |
print(f'Accuracy: {accuracy}') | |
# 绘制特征重要性 | |
lgb.plot_importance(bst) | |
plt.show() |
7. NLTK(Natural Language Toolkit)
介绍:NLTK是一个强大的自然语言处理库,用于处理人类语言数据。
特点:
- 提供了丰富的文本处理工具和资源,包括词性标注、词干提取、命名实体识别等。
- 支持多种自然语言处理算法和技术,如分词、句法分析、语义分析等。
- 包含大量语料库和词汇资源,方便研究和实践。
适用场景:
- 文本分析和挖掘,如情感分析、主题提取等。
- 信息检索和检索系统的构建。
- 语言学研究和自然语言处理教学。
经典案例: 情感分析是自然语言处理中的一项重要任务,旨在确定一段文本的情感倾向,如积极、消极或中立。
import nltk | |
from nltk.tokenize import word_tokenize | |
from nltk.corpus import stopwords | |
from nltk.stem import WordNetLemmatizer | |
from nltk.sentiment.vader import SentimentIntensityAnalyzer | |
nltk.data.path.append('/Users/yaojianguo/nltk_data', '/Library/Frameworks/Python.framework/Versions/3.9/nltk_data', '/Library/Frameworks/Python.framework/Versions/3.9/share/nltk_data', '/Library/Frameworks/Python.framework/Versions/3.9/lib/nltk_data', '/usr/share/nltk_data', '/usr/local/share/nltk_data', '/usr/lib/nltk_data', '/usr/local/lib/nltk_data') | |
# 下载 NLTK 的数据 | |
nltk.download('punkt') | |
nltk.download('stopwords') | |
nltk.download('wordnet') | |
nltk.download('vader_lexicon') | |
# 示例文本 | |
text = "NLTK is a great library for natural language processing. I use it all the time in my projects." | |
# 分词 | |
tokens = word_tokenize(text.lower()) | |
# 去除停用词 | |
stop_words = set(stopwords.words('english')) | |
filtered_tokens = [word for word in tokens if word.isalnum() and word not in stop_words] | |
# 词形还原 | |
lemmatizer = WordNetLemmatizer() | |
lemmatized_tokens = [lemmatizer.lemmatize(word) for word in filtered_tokens] | |
# 构建文本 | |
processed_text = ' '.join(lemmatized_tokens) | |
# 情感分析 | |
sid = SentimentIntensityAnalyzer() | |
scores = sid.polarity_scores(processed_text) | |
# 输出结果 | |
print("Text:", text) | |
print("Sentiment Scores:", scores) |
首先对文本进行了分词、去除停用词和词形还原等预处理步骤,然后利用 NLTK 自带的情感分析工具 SentimentIntensityAnalyzer
对文本进行情感分析。输出结果中的 compound
分数表示整体情感倾向,可以帮助了解文本的情感色彩。
8. Gensim
介绍:Gensim是一个用于主题建模和文档相似度计算的Python库。
特点:
- 提供了快速高效的文档处理工具,支持大规模文本数据的处理。
- 支持主题建模技术,如Latent Dirichlet Allocation(LDA)等。
- 提供了词向量模型(Word2Vec)等高级文本处理功能。
适用场景:
- 主题建模和文档聚类。
- 文档相似度计算和信息检索。
- 大规模文本数据分析和挖掘。
经典案例: 使用 Word2Vec 模型进行词向量训练和应用。Word2Vec 是一种常用的词嵌入(Word Embedding)模型,它可以将每个单词表示为一个向量,从而捕捉单词之间的语义关系。
from gensim.models import Word2Vec | |
from nltk.tokenize import word_tokenize | |
import nltk | |
nltk.download('punkt') | |
# 示例文本 | |
text = "NLTK is a great library for natural language processing. I use it all the time in my projects." | |
# 分词 | |
tokens = word_tokenize(text.lower()) | |
# 构建 Word2Vec 模型 | |
model = Word2Vec([tokens], vector_size=100, window=5, min_count=1, sg=0) | |
# 查找相似词 | |
similar_words = model.wv.most_similar('nltk') | |
# 输出相似词 | |
print("Similar words to 'NLTK':", similar_words) |
首先对文本进行了分词,然后使用 Gensim 中的 Word2Vec 类构建了一个 Word2Vec 模型。通过 most_similar
方法,我们可以找到与指定单词(这里是 'nltk')最相似的其他单词。
9. Statsmodels
介绍:Statsmodels是一个用于统计建模和数据分析的Python库。
特点:
- 提供了丰富的统计模型和测试工具,如线性回归、时间序列分析等。
- 支持详细的统计检验和数据分析功能。
- 可与Pandas等数据处理库无缝集成,方便数据分析和建模。
适用场景:
- 统计分析和建模。
- 实验数据分析和统计推断。
- 经济学研究和社会科学数据分析。
经典案例: 使用线性回归模型对数据进行建模和预测。线性回归是统计学中常用的一种方法,用于建立自变量(特征)和因变量(目标)之间的线性关系模型。
import numpy as np | |
import pandas as pd | |
import statsmodels.api as sm | |
import matplotlib.pyplot as plt | |
# 创建示例数据 | |
np.random.seed(0) | |
X = 2 * np.random.rand(100, 1) | |
y = 3 + 4 * X + np.random.randn(100, 1) | |
# 将数据转换为 DataFrame | |
df = pd.DataFrame({'X': X.flatten(), 'y': y.flatten()}) | |
# 添加截距项 | |
X = sm.add_constant(X) | |
# 使用最小二乘法拟合线性回归模型 | |
model = sm.OLS(y, X).fit() | |
# 打印模型摘要 | |
print(model.summary()) | |
# 绘制数据和拟合直线 | |
plt.scatter(X[:, 1], y, color='blue') | |
plt.plot(X[:, 1], model.predict(X), color='red') | |
plt.xlabel('X') | |
plt.ylabel('y') | |
plt.title('Linear Regression') | |
plt.show() |
10. Caffe
- 介绍:Caffe是一个由Berkeley Vision and Learning Center开发的深度学习框架,特别适用于视觉识别任务。
- 特点:
- 高效、模块化的设计,易于扩展和定制。
- 支持GPU加速,能够处理大规模图像数据。
- 提供了丰富的预训练模型和网络结构,方便用户快速构建模型。
- 适用场景:
- 图像分类和识别。
- 目标检测和图像分割。
- 视觉识别相关的研究和应用开发。
经典案例: 图像分类任务,其中使用预训练的卷积神经网络(Convolutional Neural Network,CNN)模型对图像进行分类。
import caffe | |
import numpy as np | |
import matplotlib.pyplot as plt | |
# 设置 Caffe 模型和权重文件路径 | |
model_def = 'path/to/deploy.prototxt' | |
model_weights = 'path/to/model.caffemodel' | |
# 加载模型 | |
net = caffe.Net(model_def, model_weights, caffe.TEST) | |
# 加载图像并进行预处理 | |
image = caffe.io.load_image('image.jpg') | |
transformer = caffe.io.Transformer({'data': net.blobs['data'].data.shape}) | |
transformer.set_transpose('data', (2,0,1)) | |
transformed_image = transformer.preprocess('data', image) | |
# 将图像输入网络进行前向传播 | |
net.blobs['data'].data[...] = transformed_image | |
output = net.forward() | |
# 获取预测结果 | |
output_prob = output['prob'][0] # 输出层名称为 'prob' | |
predicted_class = np.argmax(output_prob) | |
# 加载类别标签文件 | |
with open('path/to/labels.txt') as f: | |
labels = f.readlines() | |
# 显示图像和预测结果 | |
plt.imshow(image) | |
plt.axis('off') | |
plt.title('Predicted Class: ' + labels[predicted_class]) | |
plt.show() |
这个例子中,首先设置了 Caffe 模型和权重文件的路径,然后加载了预训练的模型,加载了要分类的图像,并进行了预处理。将预处理后的图像输入网络进行前向传播,得到模型的输出结果。最后,我们根据输出结果获取预测的类别,并加载类别标签文件以便可视化预测结果。