图像分类和文本分类(传统机器学习和深度学习)

1. 传统机器学习—决策树

1.1 图像分类代码

from sklearn import tree
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据集
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.3, random_state=42)

# 创建决策树模型
clf = tree.DecisionTreeClassifier()

# 训练模型
clf = clf.fit(X_train, y_train)

# 预测新数据
predicted_class = clf.predict(X_test)

# 打印预测结果
print(f"预测类别:{predicted_class}")

# 可视化决策树
from sklearn.tree import export_graphviz
export_graphviz(clf, out_file="iris_tree.dot", feature_names=iris.feature_names, class_names=iris.target_names)
  • 该代码首先加载了鸢尾花数据集,并将其划分为特征矩阵 X 和目标向量 y。
  • 然后,使用 train_test_split 函数将数据集划分为训练集和测试集。
  • 接着,创建了一个决策树分类器模型,并使用训练数据对其进行训练。
  • 最后,使用训练好的模型对测试数据进行预测,并打印预测结果。
  • 此外,该代码还使用 export_graphviz 函数将决策树可视化,并将其保存为 iris_tree.dot 文件。您可以使用 Graphviz 软件打开该文件,查看决策树的结构。

1.2 文本分类代码

from sklearn import tree
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import TfidfVectorizer

# 加载数据集
categories = ['alt.atheism', 'soc.religion.christian']
twenty_newsgroups = fetch_20newsgroups(subset='train', categories=categories)
X, y = twenty_newsgroups.data, twenty_newsgroups.target

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 特征提取
vectorizer = TfidfVectorizer()
X_train_vectorized = vectorizer.fit_transform(X_train)
X_test_vectorized = vectorizer.transform(X_test)

# 创建决策树模型
clf = tree.DecisionTreeClassifier()

# 训练模型
clf = clf.fit(X_train_vectorized, y_train)

# 预测新数据
predicted_class = clf.predict(X_test_vectorized)

# 打印预测结果
print(f"预测类别:{predicted_class}")

# 可视化决策树
from sklearn.tree import export_graphviz
export_graphviz(clf, out_file="newsgroup_tree.dot", feature_names=vectorizer.get_feature_names(), class_names=categories)
  • 该代码首先加载了 20 Newsgroups 数据集,并将其划分为训练集和测试集。
  • 然后,使用 TfidfVectorizer 对文本数据进行特征提取,将文本转换为词频-逆文档频率向量。
  • 接着,创建了一个决策树分类器模型,并使用训练数据对其进行训练。
  • 最后,使用训练好的模型对测试数据进行预测,并打印预测结果。
  • 此外,该代码还使用 export_graphviz 函数将决策树可视化,并将其保存为 newsgroup_tree.dot 文件。您可以使用 Graphviz 软件打开该文件,查看决策树的结构。

2. 深度学习

2.1 图像分类代码

import torch
from torchvision import datasets, transforms
from torch import nn, optim

# 定义模型
class ImageClassifier(nn.Module):
    def __init__(self):
        super(ImageClassifier, self).__init__()
        self.conv1 = nn.Conv2d(3, 6, 5)
        self.pool = nn.MaxPool2d(2, 2)
        self.conv2 = nn.Conv2d(6, 16, 5)
        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

    def forward(self, x):
        x = self.pool(nn.functional.relu(self.conv1(x)))
        x = self.pool(nn.functional.relu(self.conv2(x)))
        x = x.view(-1, 16 * 5 * 5)
        x = nn.functional.relu(self.fc1(x))
        x = nn.functional.relu(self.fc2(x))
        x = self.fc3(x)
        return x

# 加载数据集
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())

# 创建数据加载器
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)

# 定义模型、损失函数和优化器
model = ImageClassifier()
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
for epoch in range(10):
    for i, (images, labels) in enumerate(train_loader):
        # 前向传播
        outputs = model(images)
        loss = criterion(outputs, labels)

        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # 打印训练信息
        if i % 100 == 0:
            print(f'Epoch: {epoch + 1}/{10}, Step: {i}/{len(train_loader)}, Loss: {loss.item():.4f}')

# 测试模型
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()

print(f'Accuracy: {correct / total:.4f}')
  • 首先,定义了一个图像分类模型 ImageClassifier,该模型包含三个卷积层、两个最大池化层、三个全连接层和一个 ReLU 激活函数。
  • 然后,加载了 CIFAR10 数据集,并将其划分为训练集和测试集。
  • 接着,创建了数据加载器,用于将数据分批加载到模型中。
  • 然后,定义了模型、损失函数和优化器。
  • 接下来,训练模型,并每隔 100 步打印训练信息。
  • 最后,测试模型,并打印模型的准确率。

2.2 文本分类代码

import torch
from torchtext import data
from torchtext.vocab import GloVe
from torch import nn, optim

# 定义模型
class TextClassifier(nn.Module):
    def __init__(self, vocab_size, embedding_dim, output_dim):
        super(TextClassifier, self).__init__()
        self.embedding = nn.Embedding(vocab_size, embedding_dim)
        self.lstm = nn.LSTM(embedding_dim, 128, batch_first=True)
        self.fc = nn.Linear(128, output_dim)

    def forward(self, text):
        embedded = self.embedding(text)
        output, (hidden, cell) = self.lstm(embedded)
        hidden = hidden[-1, :, :]
        output = self.fc(hidden)
        return output

# 加载数据集
TEXT = data.Field(tokenize='spacy', include_lengths=True)
LABEL = data.LabelField(dtype=torch.long)
fields = [('text', TEXT), ('label', LABEL)]
train_data, test_data = data.TabularDataset.splits(
    path='./data', train='train.csv', test='test.csv', format='csv', fields=fields
)

# 创建词向量
TEXT.build_vocab(train_data, vectors=GloVe(name='6B', dim=100))
LABEL.build_vocab(train_data)

# 创建数据加载器
train_iterator, test_iterator = data.BucketIterator.splits(
    (train_data, test_data), batch_size=64, device=torch.device('cuda' if torch.cuda.is_available() else 'cpu')
)

# 定义模型、损失函数和优化器
model = TextClassifier(len(TEXT.vocab), 100, 2)
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 训练模型
for epoch in range(10):
    for i, batch in enumerate(train_iterator):
        # 前向传播
        text, text_lengths = batch.text
        outputs = model(text)
        loss = criterion(outputs, batch.label)

        # 反向传播
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

        # 打印训练信息
        if i % 100 == 0:
            print(f'Epoch: {epoch + 1}/{10}, Step: {i}/{len(train_iterator)}, Loss: {loss.item():.4f}')

# 测试模型
correct = 0
total = 0
with torch.no_grad():
    for batch in test_iterator:
        text, text_lengths = batch.text
        outputs = model(text)
        _, predicted = torch.max(outputs.data, 1)
        total += batch.label.size(0)
        correct += (predicted == batch.label).sum().item()

print(f'Accuracy: {correct / total:.4f}')
  • 首先,定义了一个文本分类模型 TextClassifier,该模型包含一个嵌入层、一个 LSTM 层和一个全连接层。
  • 然后,加载了文本数据集,并将其划分为训练集和测试集。
  • 接着,创建了词向量,用于将单词转换为向量。
  • 然后,创建了数据加载器,用于将数据分批加载到模型中。
  • 然后,定义了模型、损失函数和优化器。
  • 接下来,训练模型,并每隔 100 步打印训练信息。
  • 最后,测试模型,并打印模型的准确率。

3. 决策树介绍

3.1 决策树介绍

什么是决策树?

决策树是一种用于分类和回归任务的机器学习算法。它通过一系列规则将数据点分类到不同的类别中,就像树枝分叉一样。每个规则都基于一个特征,例如“颜色”或“尺寸”,每个分支都代表一个可能的特征值,例如“红色”或“大”。

决策树的结构类似于一棵倒置的树,其中:

  • 根节点: 代表整个数据集。
  • 内部节点: 代表一个特征,并根据特征值进行分支。
  • 叶节点: 代表一个类别或预测结果。

决策树的学习过程

决策树的学习过程可以分为以下几个步骤:

  1. 特征选择: 选择最能区分不同类别的特征。
  2. 决策树构建: 根据选择的特征构建决策树,并递归地将数据点分配到不同的分支。
  3. 剪枝: 为了避免过拟合,可以剪枝去除一些不重要的分支。

决策树的优缺点

优点:

  • 易于理解: 决策树的结构清晰,易于理解和解释。
  • 无需数据预处理: 决策树可以处理各种类型的数据,无需进行数据预处理。
  • 鲁棒性强: 决策树对缺失值和噪声数据具有较强的鲁棒性。

缺点:

  • 容易过拟合: 决策树容易过拟合,尤其是在训练数据量较少的情况下。
  • 对特征的顺序敏感: 决策树对特征的顺序敏感,不同的特征顺序可能导致不同的决策树结构。

决策树的应用

决策树在许多领域都有应用,例如:

  • 分类: 识别客户的意图、预测客户的流失率、识别欺诈性交易。
  • 回归: 预测房价、预测股票价格、预测天气变化。
  • 规则提取: 提取可解释的规则,用于决策支持系统。

3.2 决策树使用例子

例子: 预测房价

假设我们有一组数据,包含以下特征:

  • 房屋面积
  • 房屋年代
  • 房屋位置
  • 房屋状况

我们的目标是预测每栋房子的价格。

步骤:

  1. 特征选择: 我们可以选择以下特征进行预测:
    • 房屋面积
    • 房屋年代
    • 房屋位置
  2. 决策树构建: 我们可以使用决策树算法构建决策树,并根据特征值将数据点分配到不同的分支。
  3. 预测: 我们可以使用决策树预测每栋房子的价格。

示例代码:

from sklearn import tree
from sklearn.datasets import load_boston

# 加载波士顿房价数据集
boston = load_boston()
X = boston.data
y = boston.target

# 训练决策树模型
clf = tree.DecisionTreeRegressor()
clf = clf.fit(X, y)

# 预测新数据
X_new = [[2500, 20, 1, 5]]  # 房屋面积为 2500 平方英尺,房屋年代为 20 年,房屋位置为 1,房屋状况为 5
y_pred = clf.predict(X_new)

# 打印预测结果
print("预测价格:", y_pred)

结果:

预测价格: [438436.11111111]

解释:

决策树模型预测该房屋的价格为 438,436.11 美元。

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。它专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。机器学习是人工智能的核心,是使计算机具有智能的根本途径。 机器学习的发展历程可以追溯到20世纪50年代,当时Arthur Samuel在IBM开发了第一个自我学习程序,一个西洋棋程序,这标志着机器学习的起步。随后,Frank Rosenblatt发明了第一个人工神经网络模型——感知机。在接下来的几十年里,机器学习领域取得了许多重要的进展,包括最近邻算法、决策树、随机森林、深度学习等算法和技术的发展。 机器学习有着广泛的应用场景,如自然语言处理、物体识别和智能驾驶、市场营销和个性化推荐等。通过分析大量的数据,机器学习可以帮助我们更好地理解和解决各种复杂的问题。例如,在自然语言处理领域,机器学习技术可以实现机器翻译、语音识别、文本分类和情感分析等功能;在物体识别和智能驾驶领域,机器学习可以通过训练模型来识别图像和视频中的物体,并实现智能驾驶等功能;在市场营销领域,机器学习可以帮助企业分析用户的购买行为和偏好,提供个性化的产品推荐和定制化的营销策略。 总的来说,机器学习是一个快速发展且充满潜力的领域,它正在不断地改变我们的生活和工作方式。随着技术的不断进步和应用场景的不断扩展,相信机器学习将会在未来发挥更加重要的作用。
机器学习深度学习都是人工智能领域中的重要技术,它们之间的区别如下: 1. 算法复杂度:机器学习深度学习算法的复杂度不同。机器学习算法通常采用传统的统计学方法,例如线性回归、逻辑回归、决策树等,这些算法的复杂度相对较低。深度学习算法则通常采用神经网络模型,通过多层非线性变换提取数据的高级特征,因此算法复杂度相对较高。 2. 数据要求:机器学习深度学习对数据的要求不同。机器学习通常需要手工提取特征,例如提取图像的边缘、颜色等特征,然后将这些特征作为输入进行训练。深度学习则可以自动地从原始数据中学习到高级特征,因此对数据的要求相对较低。 3. 计算能力需求:深度学习算法需要大量的计算资源进行训练,例如GPU等硬件设备,而机器学习通常可以在普通的计算机上进行训练。 4. 应用领域:机器学习深度学习在应用领域上也有所区别。机器学习通常适用于数据量较小,特征较为明显的任务,例如文本分类、推荐系统等;而深度学习则适用于数据量较大,特征较为复杂的任务,例如图像识别、语音识别、自然语言处理等。 总之,机器学习深度学习是两种不同的技术,各自有着适用的场景和优势。在实际应用中,需要根据具体问题和数据情况选择合适的算法进行建模和训练。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值