Python机器学习迷你课程

Python是发展最快的应用机器学习平台之一。

在这个迷你课程中,你将了解如何使用Python在14天内入门、构建准确的模型并自信地完成预测建模机器学习项目。

这是一个又长又重要的文章。你可能想要将其添加为书签。

我们开始吧。

这个迷你课程是为谁开设的?

在我们开始之前,让我们确认一下你是否在正确的位置。

下面的列表提供了一些有关为谁设计此课程的一般指导原则。

如果你不完全符合这些要点,不要惊慌,你可能只需要在一个或另一个领域温习一下就可以跟上了。

  • 知道如何编写一些代码的开发人员。这意味着,一旦你了解了基本语法,学习一门新的编程语言(如Python)并不是什么大不了的事。这并不意味着你是向导程序员,只是说你可以毫不费力地使用基本的类C语言。
  • 了解一点机器学习的开发人员。这意味着你了解机器学习的基础知识,如交叉验证、一些算法和偏差-方差权衡。这并不意味着你是一个机器学习博士,只是说你知道这些地标,或者知道去哪里查找它们。

这个迷你课程既不是关于Python的教科书,也不是关于机器学习的教科书。

它将把你从一个懂一点机器学习的开发人员带到一个可以使用Python生态系统获得结果的开发人员,Python生态系统是一个新兴的专业机器学习平台。

迷你课程概述

这门迷你课程分为14节课。

你可以每天完成一节课(推荐),也可以在一天内完成所有课程(硬核!)。这真的取决于你有空的时间和你的热情程度。

以下是在Python中使用机器学习的14个经验教训,它们将帮助你入门并提高效率:

  • 第1课:下载并安装Python和SciPy生态系统。
  • 第2课:使用Python、NumPy、Matplotlib和Pandas。
  • 第3课:从CSV加载数据。
  • 第4课:使用描述性统计理解数据。
  • 第5课:通过可视化理解数据。
  • 第6课:通过预处理数据为建模做准备。
  • 第7课:使用重采样方法进行算法评估。
  • 第8课:算法评估度量。
  • 第9课:抽查算法。
  • 第10课:模型比较和选择。
  • 第11课:通过算法调优提高精度。
  • 第12课:通过集合预测提高准确性。
  • 第13课:完成并保存你的模型。
  • 第14课:“你好,世界”端到端项目。

每节课可能需要你60秒或最多30分钟。慢慢来,按照你自己的节奏完成课程。提出问题,甚至在下面的评论中发布结果。

课程期望你去学习如何去做事情。我会给你一些提示,但每节课的部分要点是强迫你学习到哪里去寻找关于Python平台的帮助。

第1课:下载并安装Python和SciPy

在访问平台之前,你不能开始使用Python中的机器学习。

今天的课程很简单,你必须下载并在你的电脑上安装Python3.6平台。

访问Python主页并下载适用于你的操作系统(Linux、OS X或Windows)的Python。在你的计算机上安装Python。你可能需要使用特定于平台的包管理器,如OSX上的macports或RedHat Linux上的yum。

你还需要安装SciPy平台和SCRICKIT-LEARN库。我建议使用与安装Python相同的方法。

有了Anaconda,你可以一次安装所有东西(容易得多)。推荐给初学者。

通过在命令行中键入“python”首次启动Python。

使用以下代码检查你需要的所有内容的版本:

# 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__))

如果有任何错误,请停止。现在需要修复它们。

需要帮忙吗?请参阅本教程:

如何用Anaconda构建机器学习和深度学习的Python环境

第2课:使用Python、NumPy、Matplotlib和Pandas

你需要能够读写基本的Python脚本。

作为一名开发人员,你可以很快掌握新的编程语言。Python区分大小写,对注释使用散列(#),并使用空格表示代码块(空格很重要)。

今天的任务是在Python交互环境中练习Python编程语言的基本语法和重要的SciPy数据结构。

  • 练习作业,使用Python中的列表和流控制。
  • 练习使用NumPy数组。
  • 练习在Matplotlib中创建简单的绘图。
  • 练习使用熊猫系列和DataFrames。

例如,下面是一个创建Pandas DataFrame的简单示例。

# dataframe
import numpy
import pandas
myarray = numpy.array([[1, 2, 3], [4, 5, 6]])
rownames = ['a', 'b']
colnames = ['one', 'two', 'three']
mydataframe = pandas.DataFrame(myarray, index=rownames, columns=colnames)
print(mydataframe)

第3课:从CSV加载数据

机器学习算法需要数据。你可以从CSV文件加载你自己的数据,但是当你开始使用Python进行机器学习时,你应该在标准的机器学习数据集上进行练习。

今天课程的任务是轻松地将数据加载到Python中,并查找和加载标准机器学习数据集。

有许多CSV格式的优秀标准机器学习数据集,你可以在UCI机器学习存储库下载并使用它们进行练习。

为了让你开始学习,下面是一个片段,它将使用Pandas直接从UCI机器学习库中加载PIMA印第安人糖尿病发病数据集。

# Load CSV using Pandas from URL
import pandas
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pandas.read_csv(url, names=names)
print(data.shape)

第4课:使用描述性统计了解数据

一旦将数据加载到Python中,你就需要能够理解它。

你越能更好地理解你的数据,你可以构建的模型就越好、越准确。理解数据的第一步是使用描述性统计。

今天,你的课程是学习如何使用描述性统计来理解你的数据。我推荐使用Pandas DataFrame上提供的帮助器函数。

  • 使用head()函数查看前几行了解你的数据。
  • 使用shape属性查看数据的维度。
  • 使用dtypes属性查看每个属性的数据类型。
  • 使用describe()函数查看数据的分布。
  • 使用corr()函数计算变量之间的成对相关性。

下面的示例加载PIMA印第安人糖尿病发病数据集,并汇总每个属性的分布。

# Statistical Summary
import pandas
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pandas.read_csv(url, names=names)
description = data.describe()
print(description)

第5课:通过可视化了解数据

从昨天的课程继续,你必须花时间更好地理解你的数据。

第二种提高你对数据理解的方法是使用数据可视化技术(例如绘图)。

今天,你的课程是学习如何在Python中使用绘图来单独理解属性及其交互作用。同样,我建议使用Pandas DataFrame上提供的帮助器函数。

  • 使用hist()函数创建每个属性的直方图。
  • 使用plot(kind=’box’)函数创建每个属性的框状图。
  • 使用pandas.scatter_matrix()函数创建所有属性的成对散点图。

例如,下面的代码片断将加载糖尿病数据集,并创建该数据集的散点图矩阵。

# Scatter Plot Matrix
import matplotlib.pyplot as plt
import pandas
from pandas.plotting import scatter_matrix
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
data = pandas.read_csv(url, names=names)
scatter_matrix(data)
plt.show()
样例散点图矩阵

第6课:通过预处理数据为建模做准备

你的原始数据可能未设置为最适合建模的形状。

有时,你需要对数据进行预处理,以便最好地将数据中问题的固有结构呈现给建模算法。在今天的课程中,你将使用SCRICKET-LEARN提供的预处理功能。

SCRICKIT-LEARN库提供了两种用于转换数据的标准习惯用法。每个变换在不同的情况下都很有用:拟合和多重变换以及组合拟合和变换。

有许多技术可用于为建模准备数据。例如,尝试执行以下一些操作。

  • 使用刻度和中心选项标准化数字数据(例如,平均值为0,标准差为1)。
  • 使用范围选项规格化数字数据(例如,归一化到0-1的范围)。
  • 探索更高级的功能工程,如二元化。

例如,下面的代码片段加载Pima Indians发病糖尿病数据集,计算标准化数据所需的参数,然后创建输入数据的标准化副本。

# Standardize data (0 mean, 1 stdev)
from sklearn.preprocessing import StandardScaler
import pandas
import numpy
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = pandas.read_csv(url, names=names)
array = dataframe.values
# separate array into input and output components
X = array[:,0:8]
Y = array[:,8]
scaler = StandardScaler().fit(X)
rescaledX = scaler.transform(X)
# summarize transformed data
numpy.set_printoptions(precision=3)
print(rescaledX[0:5,:])

第7课:使用重采样方法进行算法评估

用于训练机器学习算法的数据集称为训练数据集。用于训练算法的数据集不能用于为你提供可靠的新数据模型精度估计。这是一个很大的问题,因为创建模型的整个想法是对新数据进行预测。

你可以使用称为重采样方法的统计方法将训练数据集分成多个子集,其中一些用于训练模型,另一些用于估计模型对不可见数据的准确性。

今天课程的目标是练习使用SCRICKIT中提供的不同重采样方法-例如,学习:

  • 将数据集拆分为训练集和测试集。
  • 使用k重交叉验证估计算法的准确性。
  • 使用省略交叉验证来估计算法的准确性。

下面的片段使用SCISKIT-LINE使用10倍交叉验证来评估PIMA印第安人糖尿病发病数据集的Logistic回归算法的准确性。

# Evaluate using Cross Validation
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
kfold = KFold(n_splits=10, random_state=7)
model = LogisticRegression(solver='liblinear')
results = cross_val_score(model, X, Y, cv=kfold)
print("Accuracy: %.3f%% (%.3f%%)") % (results.mean()*100.0, results.std()*100.0))

第8课:算法评估度量

你可以使用许多不同的度量来评估数据集上的机器学习算法的技能。

你可以通过cross_validation.cross_val_score()函数指定用于scikit-learn中的测试工具的度量,默认值可用于回归和分类问题。今天课程的目标是练习使用scikit-learn包中提供的不同算法性能度量。

  • 练习在分类问题上使用准确性和LogLoss度量。
  • 练习生成混淆矩阵和分类报告。
  • 练习在回归问题上使用RMSE和RSquared度量。

下面的片段演示了在皮马印第安人糖尿病发病数据集上计算LogLoss指标。

# Cross Validation Classification LogLoss
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
kfold = KFold(n_splits=10, random_state=7)
model = LogisticRegression(solver='liblinear')
scoring = 'neg_log_loss'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print("Logloss: %.3f (%.3f)") % (results.mean(), results.std())

第9课:抽查算法

你不可能事先知道哪种算法对你的数据执行得最好。

你必须通过反复试验的过程来发现它。我称之为抽查算法。SCRKIT-LEARN库提供了与许多机器学习算法和工具的接口,以比较这些算法的估计精度。

在本课中,你必须练习抽查不同的机器学习算法。

  • 数据集上的抽查线性算法(例如线性回归、逻辑回归和线性判别分析)。
  • 抽查数据集上的一些非线性算法(如KNN、SVM和CART)。
  • 在数据集上抽查一些复杂的集成算法(例如随机森林和随机梯度提升)。

例如,下面的代码片段在波士顿房价数据集上抽查K-近邻算法。

# KNN Regression
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsRegressor
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.data"
names = ['CRIM', 'ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO', 'B', 'LSTAT', 'MEDV']
dataframe = read_csv(url, delim_whitespace=True, names=names)
array = dataframe.values
X = array[:,0:13]
Y = array[:,13]
kfold = KFold(n_splits=10, random_state=7)
model = KNeighborsRegressor()
scoring = 'neg_mean_squared_error'
results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
print(results.mean())

第10课:模型比较和选择

既然你已经知道如何抽查数据集上的机器学习算法,那么你需要知道如何比较不同算法的估计性能并选择最佳模型。

在今天的课程中,你将练习将Python中的机器学习算法的准确性与SCRICKIT-LEARN进行比较。

  • 将数据集上的线性算法相互比较。
  • 对数据集上的非线性算法进行相互比较。
  • 将同一算法的不同配置相互比较。
  • 创建比较算法的结果曲线图。

下面的例子在皮马印第安人糖尿病发病数据集上对Logistic回归和线性判别分析进行了相互比较。

# Compare Algorithms
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
# load dataset
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
# prepare models
models = []
models.append(('LR', LogisticRegression(solver='liblinear')))
models.append(('LDA', LinearDiscriminantAnalysis()))
# evaluate each model in turn
results = []
names = []
scoring = 'accuracy'
for name, model in models:
	kfold = KFold(n_splits=10, random_state=7)
	cv_results = cross_val_score(model, X, Y, cv=kfold, scoring=scoring)
	results.append(cv_results)
	names.append(name)
	msg = "%s: %f (%f)" % (name, cv_results.mean(), cv_results.std())
	print(msg)

第11课:通过算法调优提高精确度

一旦找到在数据集上执行良好的一两个算法,你可能想要提高这些模型的性能。

提高算法性能的一种方法是根据你的特定数据集调整其参数。

SCRKIT学习库提供了两种方法来搜索机器学习算法的参数组合。你们今天课的目标是练习每一个。

  • 使用你指定的网格搜索调整算法的参数。
  • 使用随机搜索调整算法的参数。

下面的片段使用的是在皮马印第安人糖尿病发病数据集上使用网格搜索岭回归算法的示例。

# Grid Search for Algorithm Tuning
from pandas import read_csv
import numpy
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
alphas = numpy.array([1,0.1,0.01,0.001,0.0001,0])
param_grid = dict(alpha=alphas)
model = Ridge()
grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=3)
grid.fit(X, Y)
print(grid.best_score_)
print(grid.best_estimator_.alpha)

第12课:利用集合预测提高准确性

提高模型性能的另一种方法是组合来自多个模型的预测。

一些模型内置了此功能,例如用于装袋的随机森林和用于提升的随机梯度提升。另一种称为投票的集成可用于将来自多个不同模型的预测组合在一起。

在今天的课程中,你将练习使用合奏方法。

  • 使用随机森林和额外树木算法练习套袋。
  • 使用梯度助推机和AdaBoost算法练习助推合奏。
  • 通过将来自多个模型的预测组合在一起来练习投票组合的使用。

下面的代码片段演示了如何在皮马印第安人糖尿病发病数据集上使用随机森林算法(一组打包的决策树)。

# Random Forest Classification
from pandas import read_csv
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
num_trees = 100
max_features = 3
kfold = KFold(n_splits=10, random_state=7)
model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)
results = cross_val_score(model, X, Y, cv=kfold)
print(results.mean())

第13课:最终确定并保存模型

一旦你在机器学习问题上找到了性能良好的模型,你就需要最终确定它。

在今天的课程中,你将练习与完成模型相关的任务。

  • 练习使用模型对新数据(培训和测试期间看不到的数据)进行预测。
  • 练习将训练过的模型保存到文件并再次加载它们。

例如,下面的代码片段显示了如何创建Logistic回归模型,将其保存到文件,然后稍后加载,并对不可见的数据进行预测。

# Save Model Using Pickle
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
import pickle
url = "https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv"
names = ['preg', 'plas', 'pres', 'skin', 'test', 'mass', 'pedi', 'age', 'class']
dataframe = read_csv(url, names=names)
array = dataframe.values
X = array[:,0:8]
Y = array[:,8]
test_size = 0.33
seed = 7
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=test_size, random_state=seed)
# Fit the model on 67%
model = LogisticRegression(solver='liblinear')
model.fit(X_train, Y_train)
# save the model to disk
filename = 'finalized_model.sav'
pickle.dump(model, open(filename, 'wb'))

# some time later...

# load the model from disk
loaded_model = pickle.load(open(filename, 'rb'))
result = loaded_model.score(X_test, Y_test)
print(result)

第14课:Hello World端到端项目

现在你知道了如何完成预测建模机器学习问题的每个任务。

在今天的课程中,你需要练习将各个部分组合在一起,并端到端地处理标准的机器学习数据集。

端到端地处理虹膜数据集(机器学习的问候世界)。

这包括以下步骤:

  • 使用描述性统计和可视化来理解你的数据。
  • 对数据进行预处理,以最好地揭示问题的结构。
  • 使用你自己的测试工具抽查许多算法。
  • 使用算法参数调整来改善结果。
  • 使用集成方法改进结果。
  • 最后确定模型,为将来使用做好准备。

慢慢来,一路上记录你的结果。

结束了!

你成功了。

花点时间回顾一下你已经走了多远。

  • 一开始,你对机器学习很感兴趣,并且强烈希望能够使用Python练习和应用机器学习。
  • 你可能是第一次下载、安装和启动Python,并且开始熟悉该语言的语法。
  • 在许多课程的过程中,你缓慢而稳定地了解了预测建模机器学习项目的标准任务是如何映射到Python平台上的。
  • 根据常见机器学习任务的食谱,你使用Python端到端地解决了第一个机器学习问题。
  • 使用标准模板,根据你收集的食谱和经验,你现在可以独立解决新的和不同的预测建模机器学习问题。

不要对此掉以轻心,你在短时间内已经走了很长的路。

这只是你使用Python进行机器学习之旅的开始。不断练习和发展你的技能。

00

机器学习入门

发表评论

电子邮件地址不会被公开。 必填项已用*标注

什么阻碍了你实现迈入机器学习领域的目标?

什么阻碍了你实现迈入机器学习领域的目标?

2020-04-22 机器学习

如果你在为进入机器学习领域而挣扎,感觉到有什么东西阻止了自己的开始,那么你应该看看这篇文章。 在这篇文章中,我们会讨论阻止进入机器学习领域的自我限制的信念,让你明白面临的问题。 几乎总是一种自我限制的信念阻碍了你们的进步。 也许你会在一个或多个这样的信念中看到自己。如果是这样的话, [......]

了解详情

R语言机器学习迷你课程

R语言机器学习迷你课程

2020-08-12 机器学习

在这个迷你课程中,你将发现如何开始,构建精确的模型,并自信地完成在14天内使用R预测建模机器学习项目。 这是一个重要而重要的文章。你可能想把它书签。 了解如何准备数据,拟合机器学习模型,并用我的新书评估他们在r上的预测,包括14步教程、3个项目和完整源代码。 我们开始吧。 [......]

了解详情

关于机器学习的几点思考

关于机器学习的几点思考

2020-04-26 机器学习

机器学习是一个大的、跨学科的研究领域。 你可以通过机器学习获得令人印象深刻的结果,并找到非常具有挑战性的问题的解决方案。但这只是更广泛的机器学习领域的一小部分,通常被称为预测建模或预测分析。 在这篇文章中,你将发现如何改变你对机器学习的思考方式,以便更好地为你提供机器学习实践者的服务。 [......]

了解详情

找到你的机器学习部落

找到你的机器学习部落

2020-04-26 机器学习

机器学习是一个充满算法和数据的迷人而强大的研究领域。 问题是,有这么多不同类型的人对机器学习感兴趣,每个人都有不同的需求。重要的是要了解你想要从机器学习中得到什么,并根据这些需求调整你的自学。 如果你不这样做,你很容易就会陷入困境,迷失方向,失去兴趣,得不到你想要的东西。 找到 [......]

了解详情

应用机器学习过程

应用机器学习过程

2020-04-26 机器学习

随着时间的推移,在处理应用机器学习问题时,你会开发出一种模式或流程,以快速获得良好的正常结果。 一旦开发完成,你就可以在一个又一个项目上反复使用此过程。你的流程越健壮、越发达,你就能越快地获得可靠的结果。 在这篇文章中,我想与你分享我解决机器学习问题的过程框架。 你可以将其用作下一 [......]

了解详情