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.数据可视化
使用两种类型的图:
- 单变量图以更好地理解每个属性。
- 多变量图以更好地理解属性之间的关系。
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. 评估一些算法
创建一些数据模型并估计它们对看不见的数据的准确性。
- 分离出一个验证数据集。
- 设置测试工具以使用 10 折交叉验证。
- 建立 5 个不同的模型来通过花卉测量来预测物种
- 选择最佳模型。
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