机器学习实战 | Python机器学习算法应用实践

机器学习实战(基于Scikit-Learn和TensorFlow)(1) 一、下载数据 import os import tarfile from six.moves import urllib DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml/master/" HOUSING_PATH = "datasets/housing" HOUSING_URL = DOWNLOAD_RO... 阅读详情
AI摘要

本文带领读者通过Python实践,从基础的鸢尾花分类到图像数据的深度学习应用,涵盖KNN、朴素贝叶斯、逻辑回归等传统算法及CNN在非结构化数据处理中的表现。

作者:韩信子@ShowMeAI
教程地址:https://www.showmeai.tech/tutorials/41
本文地址:https://www.showmeai.tech/article-detail/201
声明:版权所有,转载请联系平台与作者并注明出处
收藏ShowMeAI查看更多精彩内容


引言

本篇文章希望带大家完整走一遍机器学习应用流程,我们会讲解到基于Python的机器学习算法,应用在结构化数据和非结构化数据(图像)上,希望通过文章内容帮助大家在案例中重温机器学习基础知识,并学习应用机器学习解决问题的基本流程。

文章中会用到下述两个库来实现机器学习算法:

在本篇文章中,我们将讲解到以下内容:

  • 问题抽象与理解
  • 数据准备与处理(预处理、特征提取、特征工程等)
  • 各种机器学习算法
  • 实验结果分析与对比
  • 模型选择与调优

我们会覆盖到的机器学习算法包括:KNN、朴素贝叶斯、逻辑回归、SVM、决策树、随机森林、感知机、前馈神经网络、卷积神经网络。

1.环境准备

工欲善其事必先利其器,我们先安装一下必需的Python库(当然我们也推荐大家用集成环境anaconda,具体的安装与设置可以参考ShowMeAI文章 图解Python | 安装与环境设置 完成):

可以采用pip安装,命令如下:
$ pip install numpy
$ pip install pillow
$ pip install --upgrade scikit-learn
$ pip install tensorflow # or tensorflow-gpu
$ pip install keras
$ pip install opencv-contrib-python
$ pip install --upgrade imutils

2.数据集

因为本篇文章我们介绍结构化数据和非结构化数据的不同建模,我们这里用到两个数据集。

2.1 iris(鸢尾花)数据集

第一个数据集是iris(鸢尾花)数据集,它是一个入门级数据集。整个数据集都是数值型的数据,是一个结构化的表格数据,每一行代表一个样本,然后每一列就是不同的属性。

这个数据集主要是收集了三种不同的鸢尾花的数据,分别为:

  • Iris Setosa
  • Iris Versicolor
  • Iris Virginica

对应图中最后一列Class label,然后还有四种属性,分别是:

  • Sepal length:萼片长度
  • Sepal width:萼片宽度
  • Petal length:花瓣长度
  • Petal width:花瓣宽度

对于该数据集,我们的目标就是根据给定的四个属性,训练一个机器学习模型来正确分类每个样本的类别,这是一个典型的分类任务。

2.2 图像数据集

第二个数据集是一个图像数据集。它包括海岸线(Coast)、森林(Forest)和高速公路(Highway)三种场景,总共是 948 张图片,我们需要构建模型完成类别的分类,每个类别的具体图片数量如下:

  • 海岸线(Coast):360
  • 森林(Forest):328
  • 高速公路(Highway):260

3.机器学习应用步骤

我们在不同场景下应用机器学习算法,都有大致的步骤,比如下面是一个典型的机器学习应用流程:

当然,并不是其中的每一步都是必须的,我们也可能会调整其中某些步骤中的细节。

3.1 问题抽象与理解

针对我们的问题,问一下自己:

  • 数据集是哪种类型?数值型,类别型还是图像?
  • 模型的最终目标是什么?
  • 如何定义和衡量“准确率”呢?
  • 以目前自身的机器学习知识来看,哪些算法在处理这类问题上效果很好?

前序问题比较简单,最后的问题,随着大家应用机器学习解决问题的经验积累,可以更准确快速地回答。

3.2 数据准备与处理

数据准备与处理,包括数据预处理以及特征工程了。一般这一步,包括了加载数据、检查数据、探索性数据分析(EDA)、数据预处理,进而决定需要做的特征提取或者特征工程。

特征提取是应用某种算法通过某种方式来量化数据的过程。比如,对于图像数据,我们可以采用计算直方图的方法来统计图像中像素强度的分布,通过这种方式,我们就得到描述图像颜色的特征。

特征工程是将原始输入数据转换成一个更好描述潜在问题的特征表示的过程。大家可以查看ShowMeAI的 机器学习专题文章 系统了解特征工程的常见方法。

3.3 多模型应用

下一步可以选择各种候选机器学习算法,并应用在数据集上。我们安装的工具包内,包含很多机器学习算法,比如下述模型都可以用作分类:

  • 线性模型(逻辑回归、线性SVM)
  • 非线性模型(RBF、SVM、梯度下降分类器)
  • 树和基于集成的模型(决策树、随机森林)
  • 神经网络(多层感知机、卷积神经网络)

对于模型选择,当然很多需要依据实验效果来定,但我们也有一些先序的经验,比如:

  • 对于稠密型多特征的数据集,随机森林算法的效果很不错;
  • 逻辑回归算法可以很好处理高维度的稀疏数据;
  • 对于图像数据,CNNs的效果非常好。

下图为 scikit-learn工具库 官方给的一个模型选择思路参考:

4.构建机器学习流程并实验分析

我们构建如下的代码文件目录,包含四个代码文件和一个3scenes图像文件夹(内含三场景数据集),iris数据集无需另外存储,直接采用scikit-learn库载入即可。

├── 3scenes
│   ├── coast [360 entries]
│   ├── forest [328 entries]
│   └── highway [260 entries]
├── iris_classifier.py
├── image_classifier.py
├── nn_iris.py
└── basic_cnn.py

4.1 结构化数据建模

首先实现iris_classifier,我们这里直接使用sklearn的机器学习算法来对iris数据集进行分类。

# 导入需要的库
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris
import argparse

# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-m", "--model", type=str, default="knn", help="type of python machine learning model to use")
args = vars(ap.parse_args())

# 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
    "knn": KNeighborsClassifier(n_neighbors=1),
    "naive_bayes": GaussianNB(),
    "logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
    "svm": SVC(kernel="rbf", gamma="auto"),
    "decision_tree": DecisionTreeClassifier(),
    "random_forest": RandomForestClassifier(n_estimators=100),
    "mlp": MLPClassifier()
}

其中,models从前往后依次包括这些算法:KNN、朴素贝叶斯、逻辑回归、SVM、决策树、随机森林、感知机等。

我们直接调用sklearn中相应的函数来实现对应的算法即可,这里直接用一个models的字典来保存不同模型的初始化,然后根据参数--model来调用对应的模型,比如命令输入python iris_classifier.py --model knn就是调用knn算法模型。

接着就是载入数据部分:

print("加载数据中...")
dataset = load_iris()
trainX, testX, trainY, testY = train_test_split(dataset.data, dataset.target, random_state=3, test_size=0.2)

这里直接调用sklearn.datasets中的load_iris()载入数据,然后采用train_test_split来划分训练集和数据集,这里是80%数据作为训练集,20%作为测试集。

最后就是训练模型和预测部分:

# 训练模型
print("应用 '{}' 模型建模...".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)

# 预测并输出一份分类结果报告
print("评估模型效果...")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=dataset.target_names))

4.2 图像数据建模

类似的过程对三场景图像数据集构建代码image_classifier.py:

# 导入工具库
from sklearn.preprocessing import LabelEncoder
from PIL import Image
from imutils import paths
import numpy as np
import os

其中LabelEncoder是为了将标签从字符串编码为整型,然后其余几项都是处理图像相关。

对于图像数据,如果直接采用原始像素信息输入模型中,大部分的机器学习算法效果都很不理想,所以这里采用特征提取方法,主要是统计图像颜色通道的均值和标准差信息,总共是RGB3个通道,每个通道各计算均值和标准差,然后结合在一起,得到一个六维的特征,函数如下所示:

def extract_color_stats(image):
    '''
    将图片分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后返回
    :param image:
    :return:
    '''
    (R, G, B) = image.split()
    features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), np.std(B)]

    return features

然后同样会定义一个models字典,代码一样,这里就不贴出来了,然后图像载入部分的代码如下:

# 加载数据并提取特征
print("抽取图像特征中...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []

# 循环遍历所有的图片数据
for imagePath in imagePaths:
    # 加载图片,然后计算图片的颜色通道统计信息
    image = Image.open(imagePath)
    features = extract_color_stats(image)
    data.append(features)

    # 保存图片的标签信息
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# 对标签进行编码,从字符串变为整数类型
le = LabelEncoder()
labels = le.fit_transform(labels)

# 进行训练集和测试集的划分,80%数据作为训练集,其余20%作为测试集
trainX, testX, trainY, testY = train_test_split(data, labels, test_size=0.2)

上述代码就完成加载图片的路径信息,然后依次遍历,读取图片,提取特征,提取标签信息,保存特征和标签信息,接着编码标签,然后就是划分训练集和测试集。

接着是相同的训练模型和预测的代码,和前面的分类器一样。完整版代码如下:

# 导入工具库
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.neural_network import MLPClassifier
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os

# 抽取图像特征
def extract_color_stats(image):
    '''
    将图片分成 RGB 三通道,然后分别计算每个通道的均值和标准差,然后返回
    :param image:
    :return:
    '''
    (R, G, B) = image.split()
    features = [np.mean(R), np.mean(G), np.mean(B), np.std(R), np.std(G), np.std(B)]

    return features


# 设置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
                help="path to directory containing the '3scenes' dataset")
ap.add_argument("-m", "--model", type=str, default="knn",
                help="type of python machine learning model to use")
args = vars(ap.parse_args())

# 定义一个保存模型的字典,根据 key 来选择加载哪个模型
models = {
    "knn": KNeighborsClassifier(n_neighbors=1),
    "naive_bayes": GaussianNB(),
    "logit": LogisticRegression(solver="lbfgs", multi_class="auto"),
    "svm": SVC(kernel="rbf", gamma="auto"),
    "decision_tree": DecisionTreeClassifier(),
    "random_forest": RandomForestClassifier(n_estimators=100),
    "mlp": MLPClassifier()
}

# 加载数据并提取特征
print("抽取图像特征中...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []

# 循环遍历所有的图片数据
for imagePath in imagePaths:
    # 加载图片,然后计算图片的颜色通道统计信息
    image = Image.open(imagePath)
    features = extract_color_stats(image)
    data.append(features)

    # 保存图片的标签信息
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# 对标签进行编码,从字符串变为整数类型
le = LabelEncoder()
labels = le.fit_transform(labels)

# 进行训练集和测试集的划分,80%数据作为训练集,其余20%作为测试集
trainX, testX, trainY, testY = train_test_split(data, labels, random_state=3, test_size=0.2)
# print('trainX numbers={}, testX numbers={}'.format(len(trainX), len(testX)))

# 训练模型
print("[应用 '{}' 模型建模".format(args["model"]))
model = models[args["model"]]
model.fit(trainX, trainY)

# 预测并输出分类结果报告
print("模型评估")
predictions = model.predict(testX)
print(classification_report(testY, predictions, target_names=le.classes_))

完成这两份代码后,我们就可以开始运行下代码,对比不同算法在两个数据集上的性能。

4.3 不同模型建模对比

(1) KNN

K-Nearest Neighbors分类器最简单的分类算法之一。该算法依赖于特征向量之间的距离。简单地说,KNN算法通过在k个最接近的样本中最多的类别来对未知数据点进行分类。关于KNN的详细讲解可以阅读ShowMeAI的文章 图解机器学习 | KNN算法及其应用。

这里我们先运行下image_classifier.py,调用默认的模型knn,看下KNN在iris数据集上的实验结果,如下所示:

$ !python iris_classifier.py --model knn
加载数据中...
应用 'knn' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        10
  versicolor       0.90      0.90      0.90        10
   virginica       0.90      0.90      0.90        10

    accuracy                           0.93        30
   macro avg       0.93      0.93      0.93        30
weighted avg       0.93      0.93      0.93        30

其中主要是给出了对每个类别的精确率、召回率、F1以及该类别测试集数量,即分别对应precision、recall、f1-score、support。根据最后一行第一列,可以看到KNN取得93%的准确率。

接着是在三场景图片数据集上的实验结果:

$ !python image_classifier.py --model knn
抽取图像特征中...
应用 'knn' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

       coast       0.84      0.68      0.75       105
      forest       0.78      0.77      0.77        78
     highway       0.56      0.78      0.65        54

   micro avg       0.73      0.73      0.73       237
   macro avg       0.72      0.74      0.72       237
weighted avg       0.75      0.73      0.73       237

这里KNN取得75%的准确率。

ps:实际上,运行这个算法,不同次数会有不同的结果,其主要原因是因为在划分训练集和测试集的时候,代码没有设置参数random_state,这导致每次运行划分的训练集和测试集的图片都是不同的,所以运行结果也会不相同!

(2) 朴素贝叶斯

接着是朴素贝叶斯算法,关于朴素贝叶斯算法的详细讲解可以阅读ShowMeAI的文章 图解机器学习 | 朴素贝叶斯算法详解。

分别测试两个数据集,结果如下:

$ !python iris_classifier.py --model naive_bayes
加载数据中...
应用 'naive_bayes' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        15
  versicolor       1.00      0.92      0.96        12
   virginica       0.92      1.00      0.96        11

   micro avg       0.97      0.97      0.97        38
   macro avg       0.97      0.97      0.97        38
weighted avg       0.98      0.97      0.97        38
$ !python image_classifier.py --model naive_bayes
抽取图像特征中...
应用 'naive_bayes' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

       coast       0.69      0.40      0.50        88
      forest       0.68      0.82      0.74        84
     highway       0.61      0.78      0.68        65

   micro avg       0.65      0.65      0.65       237
   macro avg       0.66      0.67      0.64       237
weighted avg       0.66      0.65      0.64       237

同样,朴素贝叶斯在iris上有98%的准确率,但是在图像数据集上仅有66%的准确率。

那么,我们是否可以说明KNN算法比朴素贝叶斯好呢?当然是不可以的,上述结果只能说明在三场景图像数据集上,KNN算法优于朴素贝叶斯算法。
实际上,每种算法都有各自的优缺点和适用场景,不能一概而论地说某种算法任何时候都优于另一种算法,这需要具体问题具体分析。

(3) 逻辑回归

接着是逻辑回归算法,关于逻辑回归算法的详细讲解可以阅读ShowMeAI的文章 图解机器学习 | 逻辑回归算法详解。

分别测试两个数据集,结果如下:

$ !python iris_classifier.py --model logit
加载数据中...
应用 'logit' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        15
  versicolor       1.00      0.92      0.96        12
   virginica       0.92      1.00      0.96        11

   micro avg       0.97      0.97      0.97        38
   macro avg       0.97      0.97      0.97        38
weighted avg       0.98      0.97      0.97        38
$ !python image_classifier.py --model logit
抽取图像特征中...
应用 'logit' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

       coast       0.67      0.67      0.67        92
      forest       0.79      0.82      0.80        82
     highway       0.61      0.57      0.59        63

   micro avg       0.70      0.70      0.70       237
   macro avg       0.69      0.69      0.69       237
weighted avg       0.69      0.70      0.69       237

同样,逻辑回归在 iris 上有 98% 的准确率,但是在图像数据集上仅有 69% 的准确率

(4) 支持向量机 SVM

接着是SVM算法,关于SVM算法的详细讲解可以阅读ShowMeAI的文章 图解机器学习 | 支持向量机模型详解。

分别测试两个数据集,结果如下:

$ !python iris_classifier.py --model svm
加载数据中...
应用 'svm' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        15
  versicolor       1.00      0.92      0.96        12
   virginica       0.92      1.00      0.96        11

   micro avg       0.97      0.97      0.97        38
   macro avg       0.97      0.97      0.97        38
weighted avg       0.98      0.97      0.97        38
$ !python image_classifier.py --model svm
抽取图像特征中...
应用 'svm' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

       coast       0.84      0.76      0.80        92
      forest       0.86      0.93      0.89        84
     highway       0.78      0.80      0.79        61

   micro avg       0.83      0.83      0.83       237
   macro avg       0.83      0.83      0.83       237

同样,SVM在iris上有98%的准确率,但是在图像数据集上仅有83%的准确率。

(5) 决策树

接着是决策树算法,关于决策树算法的详细讲解可以阅读ShowMeAI的文章 图解机器学习 | 决策树模型详解。

分别测试两个数据集,结果如下:

$ !python iris_classifier.py --model decision_tree
加载数据中...
应用 'decision_tree' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        15
  versicolor       0.92      0.92      0.92        12
   virginica       0.91      0.91      0.91        11

   micro avg       0.95      0.95      0.95        38
   macro avg       0.94      0.94      0.94        38
weighted avg       0.95      0.95      0.95        38
$ !python image_classifier.py --model decision_tree
抽取图像特征中...
应用 'decision_tree' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

       coast       0.71      0.74      0.72        85
      forest       0.76      0.80      0.78        83
     highway       0.77      0.68      0.72        69

   micro avg       0.74      0.74      0.74       237
   macro avg       0.75      0.74      0.74       237
weighted avg       0.74      0.74      0.74       237

同样,决策树在iris上有98%的准确率,但是在图像数据集上仅有74%的准确率。

(6) 随机森林

接着是随机森林算法,关于随机森林算法的详细讲解可以阅读ShowMeAI的文章 图解机器学习 | 随机森林分类模型详解。

分别测试两个数据集,结果如下:

$ !python iris_classifier.py --model random_forest
加载数据中...
应用 'random_forest' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        15
  versicolor       1.00      0.83      0.91        12
   virginica       0.85      1.00      0.92        11

   micro avg       0.95      0.95      0.95        38
   macro avg       0.95      0.94      0.94        38
weighted avg       0.96      0.95      0.95        38
$ !python image_classifier.py --model random_forest
加载数据中...
应用 'random_forest' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

       coast       0.80      0.83      0.81        84
      forest       0.92      0.84      0.88        90
     highway       0.77      0.81      0.79        63

   micro avg       0.83      0.83      0.83       237
   macro avg       0.83      0.83      0.83       237
weighted avg       0.84      0.83      0.83       237

同样,随机森林在iris上有96%的准确率,但是在图像数据集上仅有84%的准确率。

注意了,一般如果决策树算法的效果还不错的话,随机森林算法应该也会取得不错甚至更好的结果,这是因为随机森林实际上就是多棵决策树通过集成学习方法组合在一起进行分类预测。

(7) 多层感知机

最后是多层感知机算法,分别测试两个数据集,结果如下:

$ !python iris_classifier.py --model mlp
加载数据中...
应用 'mlp' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        15
  versicolor       1.00      0.92      0.96        12
   virginica       0.92      1.00      0.96        11

   micro avg       0.97      0.97      0.97        38
   macro avg       0.97      0.97      0.97        38
weighted avg       0.98      0.97      0.97        38
$ !python image_classifier.py --model mlp
抽取图像特征中...
应用 'mlp' 模型建模...
评估模型效果...
              precision    recall  f1-score   support

       coast       0.72      0.91      0.80        86
      forest       0.92      0.89      0.90        79
     highway       0.79      0.58      0.67        72

   micro avg       0.80      0.80      0.80       237
   macro avg       0.81      0.79      0.79       237
weighted avg       0.81      0.80      0.80       237

同样,多层感知机在 iris 上有 98% 的准确率,但是在图像数据集上仅有 81% 的准确率.

(8) 神经网络

最后是实现深度学习的算法,也就是nn_iris.py和basic_cnn.py这两份代码。

首先是nn_iris.py的实现,同样首先是导入库和数据的处理:

# 导入工具库
from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import SGD
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris

# 载入 Iris 数据集,然后进行训练集和测试集的划分,80%数据作为训练集,其余20%作为测试集
print("加载数据中...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,
                                                  dataset.target, test_size=0.2)

# 将标签进行独热向量编码
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)

我们采用Keras来实现神经网络,然后这里需要将标签进行one-hot编码,即独热向量编码。

接着就是搭建网络模型的结构和训练、预测代码:

# 利用 Keras 定义网络模型
model = Sequential()
model.add(Dense(3, input_shape=(4,), activation="sigmoid"))
model.add(Dense(3, activation="sigmoid"))
model.add(Dense(3, activation="softmax"))

# 采用梯度下降训练模型
print('训练网络中...')
opt = SGD(lr=0.1, momentum=0.9, decay=0.1 / 250)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=250, batch_size=16)

# 预测
print('评估模型效果')
predictions = model.predict(testX, batch_size=16)
print(classification_report(testY.argmax(axis=1), predictions.argmax(axis=1), target_names=dataset.target_names))

上述代码构建了3层全连接层的神经网络,前两层采用Sigmoid激活函数,然后最后一层是输出层,所以采用softmax将输出变成概率值。优化算法选择的随机梯度下降SGD,损失函数是categorical_crossentropy,迭代次数是250次,每一批次的数据量batch_size是16。

完整版代码如下:

# 加载工具库
from keras.models import Sequential
from keras.layers.core import Dense
from keras.optimizers import SGD
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from sklearn.datasets import load_iris

# 载入 Iris 数据集,然后进行训练集和测试集的划分,80%数据作为训练集,其余20%作为测试集
print("加载数据中...")
dataset = load_iris()
(trainX, testX, trainY, testY) = train_test_split(dataset.data,
                                                  dataset.target, test_size=0.2)

# 将标签进行独热向量编码
lb = LabelBinarizer()
trainY = lb.fit_transform(trainY)
testY = lb.transform(testY)

# 利用 Keras 定义网络模型
model = Sequential()
model.add(Dense(3, input_shape=(4,), activation="sigmoid"))
model.add(Dense(3, activation="sigmoid"))
model.add(Dense(3, activation="softmax"))

# 采用梯度下降训练模型
print('训练网络中...')
opt = SGD(lr=0.1, momentum=0.9, decay=0.1 / 250)
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY), epochs=250, batch_size=16)

# 预测
print('评估模型效果...')
predictions = model.predict(testX, batch_size=16)
print(classification_report(testY.argmax(axis=1), predictions.argmax(axis=1), target_names=dataset.target_names))

直接运行命令python nn_iris.py,输出的结果如下:

$ python nn_iris.py 
Using TensorFlow backend.
加载数据中...
训练网络中...
Train on 112 samples, validate on 38 samples
Epoch 1/250
2022-02-08 10:28:19.104933: I tensorflow/core/platform/cpu_feature_guard.cc:141] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 AVX512F FMA
112/112 [==============================] - 0s 2ms/step - loss: 1.1454 - acc: 0.3214 - val_loss: 1.1867 - val_acc: 0.2368
Epoch 2/250
112/112 [==============================] - 0s 48us/step - loss: 1.0828 - acc: 0.3929 - val_loss: 1.2132 - val_acc: 0.5000
Epoch 3/250
112/112 [==============================] - 0s 47us/step - loss: 1.0491 - acc: 0.5268 - val_loss: 1.0593 - val_acc: 0.4737
...
Epoch 248/250
112/112 [==============================] - 0s 46us/step - loss: 0.1319 - acc: 0.9554 - val_loss: 0.0407 - val_acc: 1.0000
Epoch 249/250
112/112 [==============================] - 0s 46us/step - loss: 0.1024 - acc: 0.9643 - val_loss: 0.1595 - val_acc: 0.8947
Epoch 250/250
112/112 [==============================] - 0s 47us/step - loss: 0.0795 - acc: 0.9821 - val_loss: 0.0335 - val_acc: 1.0000
评估模型效果...
             precision    recall  f1-score   support

     setosa       1.00      1.00      1.00         9
 versicolor       1.00      1.00      1.00        10
  virginica       1.00      1.00      1.00        19

avg / total       1.00      1.00      1.00        38

这里得到的是100%的准确率。

(9) CNN

最后我们要应用卷积神经网络,我们实现一下basic_cnn.py代码。

同样首先是导入必须的库函数:

# 导入工具库
from keras.models import Sequential
from keras.layers.convolutional import Conv2D
from keras.layers.convolutional import MaxPooling2D
from keras.layers.core import Activation
from keras.layers.core import Flatten
from keras.layers.core import Dense
from keras.optimizers import Adam
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report
from PIL import Image
from imutils import paths
import numpy as np
import argparse
import os

# 配置参数
ap = argparse.ArgumentParser()
ap.add_argument("-d", "--dataset", type=str, default="3scenes",
                help="path to directory containing the '3scenes' dataset")
args = vars(ap.parse_args())

同样是要导入Keras来建立CNN的网络模型,另外因为是处理图像数据,所以PIL、imutils也是要导入的。

然后是加载数据和划分训练集和测试集,对于加载数据,这里直接采用原始图像像素数据,只需要对图像数据做统一尺寸的调整,这里是统一调整为32×32,并做归一化到[0,1]的范围。

# 加载数据并提取特征
print("抽取图像特征中...")
imagePaths = paths.list_images(args['dataset'])
data = []
labels = []

# 循环遍历所有的图片数据
for imagePath in imagePaths:
    # 加载图片,然后调整成 32×32 大小,并做归一化到 [0,1]
    image = Image.open(imagePath)
    image = np.array(image.resize((32, 32))) / 255.0
    data.append(image)

    # 保存图片的标签信息
    label = imagePath.split(os.path.sep)[-2]
    labels.append(label)

# 对标签编码,从字符串变为整型
lb = LabelBinarizer()
labels = lb.fit_transform(labels)

# 划分训练集和测试集
(trainX, testX, trainY, testY) = train_test_split(np.array(data), np.array(labels), test_size=0.25)

接着定义了一个4层的CNN网络结构,包含3层卷积层和最后一层输出层,优化算法采用的是Adam而不是SGD。代码如下所示:

# 定义 CNN 网络模型结构
model = Sequential()
model.add(Conv2D(8, (3, 3), padding="same", input_shape=(32, 32, 3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(16, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(32, (3, 3), padding="same"))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Flatten())
model.add(Dense(3))
model.add(Activation("softmax"))

# 训练模型
print("训练网络中...")
opt = Adam(lr=1e-3, decay=1e-3 / 50)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
H = model.fit(trainX, trainY, validation_data=(testX, testY),
              epochs=50, batch_size=32)

# 预测
print("评估模型效果...")
predictions = model.predict(testX, batch_size=32)
print(classification_report(testY.argmax(axis=1),
                            predictions.argmax(axis=1), target_names=lb.classes_))

运行命令python basic_cnn.py,输出结果如下:

$ python basic_cnn.py 
Using TensorFlow backend.
加载图像数据...
训练网络中...
Train on 711 samples, validate on 237 samples
Epoch 1/50
711/711 [==============================] - 0s 629us/step - loss: 1.0647 - acc: 0.4726 - val_loss: 0.9920 - val_acc: 0.5359
Epoch 2/50
711/711 [==============================] - 0s 313us/step - loss: 0.9200 - acc: 0.6188 - val_loss: 0.7778 - val_acc: 0.6624
Epoch 3/50
711/711 [==============================] - 0s 308us/step - loss: 0.6775 - acc: 0.7229 - val_loss: 0.5310 - val_acc: 0.7553
...
Epoch 48/50
711/711 [==============================] - 0s 307us/step - loss: 0.0627 - acc: 0.9887 - val_loss: 0.2426 - val_acc: 0.9283
Epoch 49/50
711/711 [==============================] - 0s 310us/step - loss: 0.0608 - acc: 0.9873 - val_loss: 0.2236 - val_acc: 0.9325
Epoch 50/50
711/711 [==============================] - 0s 307us/step - loss: 0.0587 - acc: 0.9887 - val_loss: 0.2525 - val_acc: 0.9114
评估模型效果...
             precision    recall  f1-score   support

      coast       0.85      0.96      0.90        85
     forest       0.99      0.94      0.97        88
    highway       0.91      0.80      0.85        64

avg / total       0.92      0.91      0.91       237

CNN的准确率是达到92%,它是优于之前的几种机器学习算法的结果。

5.小结

这篇简单的机器学习教程文章中,我们调用现有的库来应用对应的机器学习算法,解决了2个简单的场景问题。通过这份简单的入门教程,希望大家了解到:

(1) 没有任何一种算法是完美的,可以完全适用所有的场景,即便是目前很热门的深度学习方法,也存在它的局限性,所以应该具体问题具体分析!

(2) 经典的5步机器学习操作流程:

  • 问题抽象与理解
  • 数据准备与处理(预处理、特征提取、特征工程等)
  • 各种机器学习算法
  • 实验结果分析与对比
  • 模型选择与调优

参考资料

ShowMeAI系列教程推荐

相关文章推荐

Python与机器学习的必读五本书,你拥有了吗? 基于大数据的人工智能如今异常火爆 Python 作为最热门的编程语言之一 是实现机器学习算法的首选语言 Python与机器学习这一话题非常的宽广 5本书虽很难覆盖全面,但仍值得细细研读 NO.1 《机器学习——Python实践》   魏贞原 著   欢迎加入python学习交流q群250933691,分享我精心准备的Python学习资料,0基础到进阶!希望你们在学习Pyth... 阅读详情

相关推荐

从零到实战:机器学习系统学习路线全拆解

机器学习入门常被海量碎片化资料困扰,真正的突破口在于构建一条从基础到实战的完整学习路径。任何机器学习项目都离不开三大支柱:Python 数据处理能力、线性代数数学直觉、核心算法原理理解。向量与矩阵不仅是数学符号,更是数据表示与神经网络前向传播的工程基础;PCA 降维、正则化、交叉验证等概念,则直接决定了模型泛化能力。掌握这些原理后,通过 scikit-learn 实现回归、分类、聚类,再用 FastAPI 将训练好的模型封装为 HTTP 接口,即可完成从实验到服务的闭环。这条路线覆盖环境配置、算法学习、项目

weixin_30265103的博客 387

机器学习实战练手项目

机器学习是一种从数据生成规则、发现模型,来帮助我们预测、判断、分析和解决问题的技术。一个机器学习项目从开始到结束大致分为5步,分别是定义问题、收集数据和预处理、选择算法和确定模型、训练拟合模型、评估并优化模型性能。......

qq_43300880的博客 2万+

23个经典机器学习实战项目汇总,适合初学者练手

项目构想:客户细分是一种根据客户的购买历史,性别,年龄,兴趣等对客户进行细分的技术。这是一个出色的项目,将改善孩子们的学习过程。对于这个初学者的项目,我们将使用泰坦尼克号数据集,其中包含幸存者和在泰坦尼克号飞船中死亡的人的真实数据。项目构想:该ML项目背后的构想是建立一个模型,该模型将对用户可以贷款多少进行分类。项目构想:该python机器学习项目的思想是开发一个机器学习项目,并自动对音频中的不同音乐流派进行分类。项目构想:协作过滤是一项很棒的技术,可根据相似用户的反应来过滤出用户可能喜欢的项目。

白话机器学习 1963

机器学习实战

在实际情况中,您可能需要使用更复杂的算法和更大的数据集来解决更复杂的问题,但是这个例子可以帮助您了解机器学习的基本概念和实践。模型评估是机器学习模型开发的重要一步,其目的是根据测试数据的效果对模型进行评估,以便对模型进行调整和改进。通常情况下,我们将 70% 的数据用作训练集,30% 的数据用作测试集。- 无监督学习:使用未标记的数据来训练模型,目的是发现数据中的模式和结构。- 召回率(Recall):指分类器正确预测出的正样本占所有正样本的比例,即正确分类的正样本数除以所有正样本数。

m0_75198698的博客 1658

Python机器学习实战:使用Flask构建机器学习API

Python机器学习实战:使用Flask构建机器学习API 作者:禅与计算机程序设计艺术 1. 背景介绍 1.1 机器学习的发展历程 1.1.1 早期机器学习

AI大模型应用之禅 1040

机器学习实战高清PDF1

前言大学毕业后,我先后在加利福尼亚和中国大陆的Intel公司工作。最初,我打算工作两年之后回学校读研究生,但是幸福时光飞逝而过,转眼就过去了六年。那时,我意识到

探索《机器学习实战》:ML_Learning_In_Action

探索《机器学习实战》:ML_Learning_In_Action 项目简介 是一个开源项目,基于马特·扎亚茨(Matt Zbąszynski)的书籍《Machine Learning in Action》,旨在为读者提供实际操作的机器学习教程。该项目通过Python代码实现书中的各种算法,帮助初学者和开发者更好地理解和应用机器学习。 技术分析 Python编程:项目采用Python作为主要编程...

gitblog_00095的博客 391

量化风控核心:信用评分卡模型的设计与迭代全流程

◦ 动态策略适配:根据评分卡结果动态调整风控流程——高分用户(>750分)秒级放款,中低分用户(600-700分)触发补充资料提交,低分用户(<600分)直接拒绝。◦ 特征有效性监控:每月计算特征IV值,对IV<0.1的低效特征(如“用户星座”)进行淘汰,同时引入新特征(如电商消费数据)。某城商行通过增量学习,评分卡PSI值长期稳定在0.1以下。◦ 数据筛选:整合征信数据(逾期记录、查询次数)、行为数据(消费频次、还款习惯),某银行评分卡纳入150+维度特征,覆盖用户偿债能力、意愿、稳定性等维度;

2501_91651383的博客 1485

探秘PowersYang的Coursera_ML_Exercise:机器学习实战宝典

探秘PowersYang的Coursera_ML_Exercise:机器学习实战宝典 去发现同类优质开源项目:https://gitcode.com/ 在这个数据爆炸的时代,机器学习已经成为我们理解和挖掘这些海量信息的关键工具。 的 项目,就是一份基于吴恩达在Coursera上的《机器学习》课程的实战练习集,旨在帮助初学者和有经验的数据科学家更好地掌握机器学习的核心概念。 项目简介 该项目是一个...

gitblog_00022的博客 312

Linux-BSP-WIFI驱动移植与调试实战——以RTL8189FS为例

本文以RTL8189FS为例,详细介绍了Linux BSP中WiFi驱动移植与调试的全流程。涵盖硬件原理图分析、内核配置、设备树适配、驱动编译加载及问题排查等关键步骤,提供实用的调试技巧和解决方案,帮助开发者高效完成嵌入式WiFi驱动开发。

moon9的博客 399

ST7789P3初始化配置

【代码】ST7789P3初始化配置。

zqq_1314的博客 4155

探索实践机器学习的利器:Practical-Machine-Learning

探索实践机器学习的利器:Practical-Machine-Learning 去发现同类优质开源项目:https://gitcode.com/ 在这个数字化时代,机器学习已成为诸多创新的核心。而GitHub上的开源项目Practical-Machine-Learning(实用机器学习)为开发者提供了一个全面的学习资源库,旨在帮助你掌握实际应用中的机器学习技术和工具。 项目简介 由Youssef H...

gitblog_00037的博客 392

微信抢红包神器自动抢软件

微信抢红包神器自动抢软件

weixin_44006731的博客 8081

机器学习推荐资源

blog Poll的笔记 (ML算法,python,Hadoop,计算广告学…) 寒小阳(ML学分计划) book Neural Networks and Deep Learning(Python代码实践) 平台 hyperverge(一个deeplearning的应用平台,里面的technology部分有很多很好的链接资源)

明歌天下 465

别再盲目学AI了,先搞懂这5种最赚钱的变现模式

2026年,“手搓”成为一个热词——用AI工具独立完成从想法到产品的全过程。央视《焦点访谈》专门报道了这一现象。云南小伙刘梓瑜用一台电脑、几款AI工具、3000元成本和10天时间,创作了AI短片,48小时播放量破千万。华为在HDC 2026上发布的,是一个“懂鸿蒙的编程智能体”,面向独立开发者一站式开箱即用。它内置UI意图验证Agent,能在模拟器上自动运行应用、判断UI和交互逻辑是否正确。故障修复成功率超过80%,分钟级自主修复。

ZDQ58818的博客 311

基于TF-IDF+KMeans聚类算法构建中文文本分类模型(附案例实战)

TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。简单来说就是:一个词语在一篇文章中出现次数越多, 同时在所有文档中出现次数越少, 越能够代表该文章。这也就是TF-IDF的含义。

m0_64336780的博客 1万+

面向程序员的机器学习:ml-mastery-zh的Python实战教程

ml-mastery-zh是MachineLearningMastery博客文章的中文翻译项目,专为程序员打造了一条从入门到实战的机器学习学习路径。本教程将带你快速掌握Python机器学习核心技能,无需深厚数学背景,通过实际项目案例和清晰步骤,让你在短时间内具备解决真实问题的能力。 ## 为什么程序员学习机器学习更容易? 程序员在学习机器学习时拥有独特优势。你的编程思维、逻辑分析能力和问题解决

gitblog_00056的博客 374

学Simulink——基于风力发电系统的建模与仿真场景:基于自适应控制的风力发电系统输出功率调节

本文详细介绍了使用Simulink搭建风力发电系统自适应控制模型的完整流程。首先阐述了风速波动对电网的影响及自适应控制的优势,然后逐步指导创建Simulink项目、搭建系统结构(包括风速源、风轮机、发电机等模块),重点讲解了模型参考自适应控制器(MRAC)的设计步骤和参数设置方法。通过仿真分析验证了系统在风速变化时仍能保持输出功率稳定,展示了自适应控制的响应速度和鲁棒性。最后提出了引入深度学习预测、多变量控制等优化方向,为新能源领域工程师提供了实用的建模与仿真指导。

amy_mhd的博客 220

一年掌握机器学习:ml-mastery-zh的循序渐进学习计划 [特殊字符]

想要在一年内掌握机器学习吗?ml-mastery-zh项目为你提供了一个完整、系统的机器学习学习路径!这个开源项目翻译了Machine Learning Mastery博客的精华内容,涵盖从基础概念到高级应用的方方面面,是中文学习者快速入门机器学习的终极指南。无论你是零基础的新手,还是有一定经验的开发者,这个项目都能帮助你建立坚实的机器学习知识体系。 ## 📚 为什么选择ml-mastery-

gitblog_00076的博客 879

YTM32B1M SDK解析31:软件I2C驱动详解

YTM32B1M微控制器软件I2C驱动解析 本文详细介绍了YTM32B1M微控制器中通过GPIO引脚模拟I2C总线的软件实现方案。核心内容包括: 驱动架构:采用swi2c_config_t配置结构体和swi2c_state_t状态结构体管理I2C参数 功能接口:提供初始化、数据传输(主/从模式)、底层控制等API 应用示例:包含基本配置、EEPROM读写、传感器数据采集、总线扫描等典型应用场景 优化建议:给出引脚选择、时序配置、错误处理等方面的最佳实践 该驱动在硬件I2C资源不足时提供可靠替代方案,支持标准

VehSwHwDeveloper的博客 160

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

机器学习项目实战合集列表

机器学习项目实战合集列表

张陈亚的博客 1万+

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

《Python机器学习实践》简介

内容包括k近邻算法、朴素贝叶斯、聚类、EM算法、支持向量机、决策树、线性回归、逻辑回归、BP神经网络经典算法,以及垃圾邮件分类、手写数字识别、零售商品销售量分析与预测、个性化推荐等综合案例。本书算法首先给出了数学原理及公式推导过程,然后给出算法实现,最后所有算法及案例均以Python实现,方便读者在动手编程中理解机器学习的经典算法。本书适合Python机器学习初学者、机器学习开发人员和研究人员使用,也可作为高等院校计算机、软件工程、大数据、人工智能等相关专业的本科生、研究生学习人工智能、机器学习的教材。

夏天又到了的专栏 622

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

基于Python的机器学习实战:分类算法的应用与实现

基于Python的机器学习实战:分类算法的应用与实现 去发现同类优质开源项目:https://gitcode.com/ 此资源文件详细介绍了使用Python进行机器学习分类算法的实践应用与具体实现。内容涵盖分类算法的基础理论知识,以及如何在实际项目中应用这些知识。适合对机器学习有一定了解,希望提高实战能力的开发者阅读学习。文件中包含了丰富的示例代码和注释,能够帮助读者更好地理解和掌握分类算法的核心...

gitblog_06705的博客 341

深入浅出 python epub_《机器学习从认知到实践(第2辑)(套装共3册,Python+TensorFlow)》epub+mobi+azw3...

套装书目 ······《Python机器学习实践指南》《TensorFlow机器学习项目实战》《TensorFlow技术解析与实战》分册简介······《Python机器学习实践指南》:机器学习是近年来渐趋热门的一个领域,同时Python语言经过一段时间的发展也已逐渐成为主流的编程语言之一。本书结合了机器学习和Python语言两个热门的领域,通过易于理解的项目详细讲述了如...

weixin_40004057的博客 403

探索机器学习的奥秘:《Python机器学习实战案例(第2版)》章节PPT资源库

探索机器学习的奥秘:《Python机器学习实战案例(第2版)》章节PPT资源库 【下载地址】Python机器学习实战案例第2版章节PPT资源库 本压缩包包含《Python机器学习实战案例(第2版)》各章的核心教学演示文稿,旨在辅助读者更好地吸收书中的理论知识与实际操作技巧。每一章的PPT都精心制作,不仅提炼了关键概念,还...

gitblog_09705的博客 1070
上一篇: 机器学习实战:手把手教你玩转机器学习系列
下一篇: 机器学习实战 | SKLearn入门与简单应用案例
ShowMeAI
博客等级 码龄5年 6514粉丝 672原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShowMeAI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值