📜  30 分钟机器学习

📅  最后修改于: 2022-05-13 01:54:30.712000             🧑  作者: Mango

30 分钟机器学习

1. 下载、安装和启动Python SciPy

如果尚未在您的系统上安装Python和 SciPy 平台,请获取它。可以轻松地按照安装指南进行操作。

1.1 安装 SciPy 库:

使用Python 2.7 或 3.5+ 版本。
您需要安装 5 个关键库。以下是本教程所需的Python SciPy 库列表:

  • scipy
  • 麻木的
  • matplotlib
  • 熊猫
  • sklearn

1.2 启动Python并检查版本:

确保您的Python环境已成功安装并按预期工作是一个好主意。
下面的脚本将有助于测试环境。它导入本教程中所需的每个库并打印版本。
键入或复制并粘贴以下脚本:

Python3
# Check the versions of libraries
 
# Python version
import sys
print('Python: {}'.format(sys.version))
# scipy
import scipy
print('scipy: {}'.format(scipy.__version__))
# numpy
import numpy
print('numpy: {}'.format(numpy.__version__))
# matplotlib
import matplotlib
print('matplotlib: {}'.format(matplotlib.__version__))
# pandas
import pandas
print('pandas: {}'.format(pandas.__version__))
# scikit-learn
import sklearn
print('sklearn: {}'.format(sklearn.__version__))


Python3
# Load libraries
 
import pandas
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC


Python3
url =
"https://raw.githubusercontent.com / jbrownlee / Datasets / master / iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length',
         'petal-width', 'class']
dataset = pandas.read_csv(url, names = names)


Python3
# shape
print(dataset.shape)


Python3
# head
print(dataset.head(20))


Python3
# descriptions
print(dataset.describe())


Python3
# class distribution
print(dataset.groupby('class').size())


Python3
# box and whisker plots
dataset.plot(kind ='box', subplots = True,
             layout =(2, 2), sharex = False, sharey = False)
plt.show()


Python3
# histograms
dataset.hist()
plt.show()


Python3
# scatter plot matrix
scatter_matrix(dataset)
plt.show()


Python3
# Split-out validation dataset
array = dataset.values
X = array[:, 0:4]
Y = array[:, 4]
validation_size = 0.20
seed = 7
X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(
        X, Y, test_size = validation_size, random_state = seed)


Python3
# Test options and evaluation metric
seed = 7
scoring = 'accuracy'


Python3
# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression(solver ='liblinear', multi_class ='ovr')))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC(gamma ='auto')))
 
# evaluate each model in turn
results = []
names = []
 
for name, model in models:
    kfold = model_selection.KFold(n_splits = 10, random_state = seed)
    cv_results = model_selection.cross_val_score(
            model, X_train, Y_train, cv = kfold, scoring = scoring)
    results.append(cv_results)
    names.append(name)
    msg = "% s: % f (% f)" % (name, cv_results.mean(), cv_results.std())
    print(msg)


Python3
# Compare Algorithms
fig = plt.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()


Python3
# Make predictions on validation dataset
knn = KNeighborsClassifier()
knn.fit(X_train, Y_train)
predictions = knn.predict(X_validation)
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))


如果出现错误,请停止。现在是修复它的时候了。

2. 加载数据:

数据集——虹膜数据

它是几乎每个人在机器学习和统计中用作“hello world”数据集的著名数据。
该数据集包含 150 个鸢尾花的观察结果。以厘米为单位的花朵有四列测量值。第五列是观察到的花的种类。所有观察到的花都属于三个物种之一。

2.1 导入库:

首先,让我们导入所有要使用的模块、函数和对象。

Python3

# Load libraries
 
import pandas
from pandas.plotting import scatter_matrix
import matplotlib.pyplot as plt
from sklearn import model_selection
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_score
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC

在继续之前需要一个工作的 SciPy 环境。

2.2 加载数据集

数据可以直接加载到 UCI 机器学习存储库中。
使用 pandas 加载数据并探索描述性统计和数据可视化。

注意:每列的名称是在加载数据时指定的。这将在以后探索数据时有所帮助。

Python3

url =
"https://raw.githubusercontent.com / jbrownlee / Datasets / master / iris.csv"
names = ['sepal-length', 'sepal-width', 'petal-length',
         'petal-width', 'class']
dataset = pandas.read_csv(url, names = names)

如果您确实有网络问题,您可以将 iris.csv 文件下载到您的工作目录并使用相同的方法加载它,将 URL 更改为本地文件名。

3. 总结数据集:

现在是时候看看数据了。
以几种不同方式查看数据的步骤:

  • 数据集的维度。
  • 查看数据本身。
  • 所有属性的统计摘要。
  • 按类变量对数据进行细分。

3.1 数据集维度

Python3

# shape
print(dataset.shape)
(150, 5)

3.2 查看数据

Python3

# head
print(dataset.head(20))
sepal-length  sepal-width  petal-length  petal-width        class
0            5.1          3.5           1.4          0.2  Iris-setosa
1            4.9          3.0           1.4          0.2  Iris-setosa
2            4.7          3.2           1.3          0.2  Iris-setosa
3            4.6          3.1           1.5          0.2  Iris-setosa
4            5.0          3.6           1.4          0.2  Iris-setosa
5            5.4          3.9           1.7          0.4  Iris-setosa
6            4.6          3.4           1.4          0.3  Iris-setosa
7            5.0          3.4           1.5          0.2  Iris-setosa
8            4.4          2.9           1.4          0.2  Iris-setosa
9            4.9          3.1           1.5          0.1  Iris-setosa
10           5.4          3.7           1.5          0.2  Iris-setosa
11           4.8          3.4           1.6          0.2  Iris-setosa
12           4.8          3.0           1.4          0.1  Iris-setosa
13           4.3          3.0           1.1          0.1  Iris-setosa
14           5.8          4.0           1.2          0.2  Iris-setosa
15           5.7          4.4           1.5          0.4  Iris-setosa
16           5.4          3.9           1.3          0.4  Iris-setosa
17           5.1          3.5           1.4          0.3  Iris-setosa
18           5.7          3.8           1.7          0.3  Iris-setosa
19           5.1          3.8           1.5          0.3  Iris-setosa

3.3 统计总结

这包括计数、平均值、最小值和最大值以及一些百分位数。

Python3

# descriptions
print(dataset.describe())

可以清楚地看到,所有数值都具有相同的比例(厘米)和相似的范围,介于 0 和 8 厘米之间。

sepal-length  sepal-width  petal-length  petal-width
count    150.000000   150.000000    150.000000   150.000000
mean       5.843333     3.054000      3.758667     1.198667
std        0.828066     0.433594      1.764420     0.763161
min        4.300000     2.000000      1.000000     0.100000
25%        5.100000     2.800000      1.600000     0.300000
50%        5.800000     3.000000      4.350000     1.300000
75%        6.400000     3.300000      5.100000     1.800000
max        7.900000     4.400000      6.900000     2.500000

3.4 类分布

Python3

# class distribution
print(dataset.groupby('class').size())
class
Iris-setosa        50
Iris-versicolor    50
Iris-virginica     50

4.数据可视化

使用两种类型的图:

  1. 单变量图以更好地理解每个属性。
  2. 多变量图以更好地理解属性之间的关系。

4.1 单变量图

单变量图 - 每个单独变量的图。
鉴于输入变量是数字的,我们可以为每个变量创建箱线图。

Python3

# box and whisker plots
dataset.plot(kind ='box', subplots = True,
             layout =(2, 2), sharex = False, sharey = False)
plt.show()

创建每个输入变量的直方图以了解分布。

Python3

# histograms
dataset.hist()
plt.show()

看起来可能有两个输入变量具有高斯分布。这一点很有用,因为我们可以使用可以利用此假设的算法。

4.2 多元图

变量之间的相互作用。
首先,让我们看一下所有属性对的散点图。这有助于发现输入变量之间的结构化关系。

Python3

# scatter plot matrix
scatter_matrix(dataset)
plt.show()

注意一些属性对的对角线分组。这表明高度相关和可预测的关系。

5. 评估一些算法

创建一些数据模型并估计它们对看不见的数据的准确性。

  1. 分离出一个验证数据集。
  2. 设置测试工具以使用 10 折交叉验证。
  3. 建立 5 个不同的模型来通过花卉测量来预测物种
  4. 选择最佳模型。

5.1 创建验证数据集

使用统计方法来估计我们在看不见的数据上创建的模型的准确性。通过对实际未见数据进行评估,可以对未见数据的最佳模型的准确性进行具体估计。
一些数据被用作算法不会看到的测试数据,这些数据用于获得第二个独立的想法,即最佳模型实际上可能有多准确。
测试数据分为两部分,其中 80% 用于训练模型,20% 用作验证数据集。

Python3

# Split-out validation dataset
array = dataset.values
X = array[:, 0:4]
Y = array[:, 4]
validation_size = 0.20
seed = 7
X_train, X_validation, Y_train, Y_validation = model_selection.train_test_split(
        X, Y, test_size = validation_size, random_state = seed)

X_train 和 Y_train 是准备模型的训练数据,以后可以使用 X_validation 和 Y_validation 集。

5.2 测试工具

使用 10 倍交叉验证来估计准确性。这会将我们的数据集分成 10 个部分,在 9 个部分进行训练并在 1 个部分进行测试,并对所有训练-测试拆分组合进行重复。

Python3

# Test options and evaluation metric
seed = 7
scoring = 'accuracy'

“准确度”指标用于评估模型。它是正确预测的实例数除以数据集中的实例总数乘以 100 得到一个百分比(例如 95% 准确)的比率。

5.3 构建模型

哪些算法可以很好地解决这个问题或使用哪些配置,目前尚不清楚。因此,从图中得出一个想法,即某些类在某些维度上是部分线性可分的。
评估 6 种不同的算法:

  • 逻辑回归 (LR)
  • 线性判别分析 (LDA)
  • K-最近邻(KNN)。
  • 分类和回归树 (CART)。
  • 高斯朴素贝叶斯 (NB)。
  • 支持向量机 (SVM)。

所选择的算法是线性(LR 和 LDA)和非线性(KNN、CART、NB 和 SVM)算法的混合。每次运行之前都会重置随机数种子,以确保使用完全相同的数据拆分执行每个算法的评估。它确保结果具有直接可比性。
建立和评估模型:

Python3

# Spot Check Algorithms
models = []
models.append(('LR', LogisticRegression(solver ='liblinear', multi_class ='ovr')))
models.append(('LDA', LinearDiscriminantAnalysis()))
models.append(('KNN', KNeighborsClassifier()))
models.append(('CART', DecisionTreeClassifier()))
models.append(('NB', GaussianNB()))
models.append(('SVM', SVC(gamma ='auto')))
 
# evaluate each model in turn
results = []
names = []
 
for name, model in models:
    kfold = model_selection.KFold(n_splits = 10, random_state = seed)
    cv_results = model_selection.cross_val_score(
            model, X_train, Y_train, cv = kfold, scoring = scoring)
    results.append(cv_results)
    names.append(name)
    msg = "% s: % f (% f)" % (name, cv_results.mean(), cv_results.std())
    print(msg)

5.4 选择最佳模型

将模型相互比较并选择最准确的模型。运行上面的示例以获得以下原始结果:

LR: 0.966667 (0.040825)
LDA: 0.975000 (0.038188)
KNN: 0.983333 (0.033333)
CART: 0.975000 (0.038188)
NB: 0.975000 (0.053359)
SVM: 0.991667 (0.025000)

支持向量机 (SVM) 的估计准确度得分最高。
创建模型评估结果图并比较每个模型的分布和平均准确度。每个算法都有一组准确度度量,因为每个算法都被评估了 10 次(10 倍交叉验证)。

Python3

# Compare Algorithms
fig = plt.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
plt.boxplot(results)
ax.set_xticklabels(names)
plt.show()

箱须图在范围的顶部被压扁,许多样本达到 100% 的准确度。

6.做出预测

KNN 算法非常简单,并且是基于我们测试的准确模型。
直接在验证集上运行 KNN 模型,并将结果总结为最终准确度得分、混淆矩阵和分类报告。

Python3

# Make predictions on validation dataset
knn = KNeighborsClassifier()
knn.fit(X_train, Y_train)
predictions = knn.predict(X_validation)
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))

准确度为 0.9 或 90%。混淆矩阵提供了三个错误的指示。最后,分类报告按精度、召回率、f1 分数和显示出色结果的支持(假设验证数据集很小)提供每个类别的细分。

0.9
[[ 7  0  0]
 [ 0 11  1]
 [ 0  2  9]]
                 precision    recall  f1-score   support

    Iris-setosa       1.00      1.00      1.00         7
Iris-versicolor       0.85      0.92      0.88        12
 Iris-virginica       0.90      0.82      0.86        11

      micro avg       0.90      0.90      0.90        30
      macro avg       0.92      0.91      0.91        30
   weighted avg       0.90      0.90      0.90        30