中国工信出版集团、电子工业出版社 魏贞原
源代码下载:https://www.broadview.com.cn/33110
https://github.com/weizy1981/MachineLearning
在进行机器学习的时候,要避免以下误区:
进行机器学习项目的步骤:
略。
demo:鸢尾花分类。数据集是含鸢尾花的三个亚属的分类信息。通过机器学习生成一个模型,自动将新数据分类到这三个亚属中的某一个。这是一个非常简单的数据集,非常适合于初学者。
数据集下载路径:https://archive.ics.uci.edu/ml/datasets/Iris
# 导入类库
from pandas import read_csv # 导入csv数据集
from pandas.plotting import scatter_matrix
from matplotlib import pyplot # 二维作图
from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
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.discriminant_analysis import LinearDiscriminantAnalysis # 线性判别分析
from sklearn.neighbors import KNeighborsClassifier # K近邻
from sklearn.naive_bayes import GaussianNB # 朴素贝叶斯
from sklearn.svm import SVC # 支持向量机
# 鸢尾花数据集 https://archive.ics.uci.edu/ml/datasets/Iris
# 导入数据
filename = 'iris.data_csv'
names = ['separ-length0', 'separ-width', 'petal-length', 'petal-width', 'class'] # 为每个数据特征指定名称
dataset = read_csv(filename, names=names)
# 探索数据,增加对数据的理解,以便于选择合适的算法
print('数据维度:行 %s, 列 %s' % dataset.shape) # 查看数据集的行数、列数
print(dataset.head(10)) # 查看数据集前10行记录
print(dataset.describe()) # 查看数据集的统计描述信息,行数、中位数、最大值、最小值、均值、四分位数
print(dataset.groupby('class').size()) # 查看分类分布情况
# 探索数据,数据可视化
dataset.plot(kind='box', subplots=True, layout=(2, 2), sharex=False, sharey=False) # 箱线图
pyplot.show()
dataset.hist() # 直方图
pyplot.show()
scatter_matrix(dataset) # 散点矩阵图
pyplot.show()
# 评估算法,通过不同的算法来创建模型,并评估其准确性,以便于找到最合适的算法
# 分离出评估数据集
array = dataset.values
X = array[:, 0:4] # 前4列数据
Y = array[:, 4] # 第5列数据
validation_size = 0.2
seed = 7
# 其中,X_train和Y_train用于训练算法模型,X_validation和Y_validation用于验证评估模型
X_train, X_validation, Y_train, Y_validation = train_test_split(X, Y, test_size=validation_size, random_state=seed)
# K折交叉验证。将训练数据集分为K份,其中K-1份用于训练模型,1份用于评估模型
# 算法审查
models = {}
models['LR'] = LogisticRegression() # 线性回归 LR
models['LDA'] = LinearDiscriminantAnalysis() # 线性判别分析 LDA
models['KNN'] = KNeighborsClassifier() # K近邻 KNN
models['CART'] = DecisionTreeClassifier() # 分类与回归树 CART
models['NB'] = GaussianNB() # 贝叶斯分类器 NB
models['SVM'] = SVC() # 支持向量机 SVM
# 评估算法
results = []
for key in models:
kfold = KFold(n_splits=10, random_state=seed)
cv_results = cross_val_score(models[key], X_train, Y_train, cv=kfold, scoring='accuracy')
results.append(cv_results)
print('%s: %f (%f)' % (key, cv_results.mean(), cv_results.std()))
# 选择最优模型,结果显示SVM算法具有最高的精确度得分
# 箱线图比较算法
fig = pyplot.figure()
fig.suptitle('Algorithm Comparison')
ax = fig.add_subplot(111)
pyplot.boxplot(results)
ax.set_xticklabels(models.keys())
pyplot.show()
# 实施预测,使用评估数据集评估算法
svm = SVC()
svm.fit(X=X_train, y=Y_train)
predictions = svm.predict(X_validation)
print(accuracy_score(Y_validation, predictions))
print(confusion_matrix(Y_validation, predictions))
print(classification_report(Y_validation, predictions))
略。
# Python导入csv数据的方法demo
############################################################################
# 方法1
from csv import reader
import numpy as np
filename = 'pima_data.csv'
with open(filename, 'rt') as raw_data:
readers = reader(raw_data, delimiter=',')
x = list(readers)
data = np.array(x).astype('float')
print(data.shape)
############################################################################
# 方法2
from numpy import loadtxt
filename = 'pima_data.csv'
with open(filename, 'rt') as raw_data:
data = loadtxt(raw_data, delimiter=',')
print(data.shape)
############################################################################
# 方法3,推荐
from pandas import read_csv
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names) # 将csv转化为DataFrame,便于进行后续的分析处理
print(data.shape)
理解数据的特征和分布,有助于对数据进行处理,从而训练出更优化的模型。可以通过以下7种方式来理解数据:
from pandas import read_csv
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
print(data.head(10)) # 显示数据的前10行
print(data.shape) # 显示数据的行和列
print(data.dtypes) # 显示数据的每个字段的类型
print(data.describe()) # 显示数据的统计性描述信息
print(data.groupby('class').size()) # 显示数据的分组分布
print(data.corr(method='pearson')) # 显示数据的皮尔逊相关系数
print(data.skew()) # 显示数据所有属性的高斯分布偏离情况
什么样的数据集才是好的训练数据集?
数据可视化是理解数据最快、最有效的方式。
from pandas import read_csv
import matplotlib.pyplot as plt
import numpy as np
filename = 'pima_data.csv'
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = read_csv(filename, names=names)
data.hist() # 直方图
data.plot(kind='density', subplots=True, layout=(3, 3), sharex=False) # 密度图
data.plot(kind='box', subplots=True, layout=(3, 3), sharex=False) # 箱线图
correlations = data.corr() # 获取相关性
fig = plt.figure()
ax = fig.add_subplot(111) # 做出底图
cax = ax.matshow(correlations, vmin=-1, vmax=1) # 将相关性作图
fig.colorbar(cax) # 设置右侧色柱
ticks = np.arange(0, 9, 1)
ax.set_xticks(ticks) # 设置x轴标签
ax.set_yticks(ticks)
ax.set_xticklabels(names) # 设置x轴注释
ax.set_yticklabels(names)
scatter_matrix(data) # 散点矩阵图
plt.show()
数据和特征决定了模型的上限,而模型和算法只是逼近这个上限而已。
要知道算法模型对未知数据的预测能力,最好的评估办法是利用已经明确知道结果的数据,运行生成的算法模型以进行验证。
计算算法的评估矩阵,以评估机器学习的算法模型。
算法审查是选择合适的机器学习算法的主要方法之一。
比较不同算法的准确度,选择合适的算法,在处理机器学习的问题时,是非常重要的。本章提供了一种对多种算法进行分析比较的方法。
有一些标准的流程,可以实现对机器学习问题的自动化处理。
将多种机器学习算法组合在一起,从而提高算法精确度的方法,被称之为集成学习。
机器学习的模型都是参数化的,可以通过调参来提高模型的准确度。
在实际生产中,找到了能够生成高准确度模型的算法之后,需要将生成的模型序列化,并将其发布到生产环境当中。
应对新的机器学习项目时,新建一个Python文件,并将这个模板粘贴进去,再按照前面章节中介绍的方法将其填充到每一个步骤中。
# Python机器学习项目的模板
# 1. 定义问题
# a) 导入类库
# b) 导入数据集
# 2. 理解数据
# a) 描述性统计
# b) 数据可视化
# 3. 数据准备
# a) 数据清洗
# b) 特征选择
# c) 数据转换
# 4. 评估算法
# a) 分离数据集
# b) 定义模型评估标准
# c) 算法审查
# d) 算法比较
# 5. 优化模型
# a) 算法调参
# b) 集成算法
# 6. 结果部署
# a) 预测评估数据集
# b) 利用整个数据集生成模型
# c) 序列化模型