教你学Python47-机器学习迷你课程
从开发人员到机器学习从业人员 14天
Python是应用机器学习发展最快的平台之一。
在本小课程中,您将发现如何在14天内使用Python入门,建立准确的模型以及自信地完成预测建模机器学习项目。
这是重要的职位。您可能要为其添加书签。
在我的新书中,通过16个循序渐进的教程,3个项目和完整的python代码,探索如何用熊猫准备数据,使用scikit-learn拟合和评估模型,以及更多内容。
让我们开始吧。
-
2016年10月更新:更新了sklearn v0.18的示例。
-
2018年2月更新:更新Python和库版本。
-
2018年3月更新:增加了备用链接以下载一些数据集,因为原始文件似乎已被删除。
-
2019年5月更新:修复了scikit-learn最新版本的警告消息。
Dave Young的 Python机器学习迷你课程
照片,保留一些权利。
迷你课程面向谁?
在开始之前,请确保您在正确的位置。
下面的列表提供了有关本课程针对谁的一些一般指导。
如果您没有完全匹配这些点,请不要惊慌,您可能只需要在一个或另一个区域刷牙以跟上。
-
知道如何编写一些代码的开发人员。这意味着,一旦您了解基本语法,就可以选择像Python这样的新编程语言,这对您来说并不重要。这并不意味着您是一名向导编码员,而是可以毫不费力地遵循基本的类似于C的语言。
-
懂一点机器学习的开发人员。这意味着您了解机器学习的基础知识,例如交叉验证,一些算法和偏差方差折衷。这并不意味着您是机器学习博士,而是您知道地标或知道在哪里查找。
这门迷你课程既不是Python的教科书,也不是机器学习的教科书。
从一个懂一点机器学习的开发人员到一个可以使用Python生态系统获得结果的开发人员,Python生态系统是专业机器学习的新兴平台。
在Python机器学习方面需要帮助吗?
参加我为期2周的免费电子邮件课程,发现数据准备,算法等(包括代码)。
单击立即注册,并获得该课程的免费PDF电子书版本。
迷你课程概述
该微型课程分为14节课。
您可以每天完成一堂课(推荐),也可以在一天内完成所有课程(核心!)。这实际上取决于您有空的时间和您的热情水平。
以下是14个课程,可帮助您入门并提高使用Python进行机器学习的效率:
-
第1课:下载并安装Python和SciPy生态系统。
-
第2课:深入了解Python,NumPy,Matplotlib和Pandas。
-
第3课:从CSV加载数据。
-
第4课:了解具有描述性统计信息的数据。
-
第5课:通过可视化了解数据。
-
第6课:通过预处理数据准备建模。
-
第7课:使用重采样方法进行算法评估。
-
第8课:算法评估指标。
-
第9课:现场检查算法。
-
第10课:模型比较和选择。
-
第11课:通过算法调整提高准确性。
-
第12课:利用集合预测提高准确性。
-
第13课:完成并保存模型。
-
第14课:Hello World端到端项目。
每节课可能需要您60秒钟或最多30分钟。花点时间按照自己的进度完成课程。提出问题,甚至在以下评论中发布结果。
这些课程希望您能开始学习并做事。我会给您提示,但每节课的重点是迫使您学习从哪里寻求有关Python平台的帮助(提示,我直接在此博客上获得了所有答案,请使用搜索特征)。
在早期课程中,我确实提供了更多帮助,因为我希望您树立一些信心和惯性。
挂在那里,不要放弃!
第1课:下载并安装Python和SciPy
您必须先访问平台才能开始使用Python进行机器学习。
今天的课程很简单,您必须在计算机上下载并安装Python 3.6平台。
访问Python主页并下载适用于您的操作系统(Linux,OS X或Windows)的Python。在计算机上安装Python。您可能需要使用特定于平台的软件包管理器,例如OS X上的macports或RedHat Linux上的yum。
您还需要安装SciPy平台和scikit-learn库。我建议使用与安装Python相同的方法。
您可以使用Anaconda一次安装所有内容(更加容易)。推荐给初学者。
通过在命令行中键入“ python”来首次启动Python。
使用以下代码检查所有您需要的版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 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__)) |
如果有任何错误,请停止。现在该修复它们了。
需要帮忙?请参阅本教程:
第2课:深入了解Python,NumPy,Matplotlib和Pandas。
您需要能够读写基本的Python脚本。
作为开发人员,您可以很快选择新的编程语言。Python区分大小写,使用哈希(#)进行注释,并使用空格指示代码块(空格很重要)。
今天的任务是在Python交互环境中练习Python编程语言的基本语法和重要的SciPy数据结构。
-
练习作业,在Python中使用列表和流程控制。
-
练习使用NumPy数组。
-
练习在Matplotlib中创建简单图。
-
练习使用Pandas Series和DataFrames。
例如,以下是创建Pandas DataFrame的简单示例。
1 2 3 4 5 6 7 8 |
# 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中并查找和加载标准的机器学习数据集。
您可以在UCI机器学习存储库上下载和练习许多CSV格式的出色标准机器学习数据集。
-
练习使用标准库中的CSV.reader()将CSV文件加载到Python 中。
-
练习使用NumPy和numpy.loadtxt()函数加载CSV文件。
-
练习使用Pandas和pandas.read_csv()函数加载CSV文件。
为了让您入门,下面是一个片段,该片段将直接从UCI机器学习存储库中使用Pandas来加载Pima Indians糖尿病数据集。
1 2 3 4 5 6 |
# 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()函数计算变量之间的成对相关性。
以下示例加载了皮马印第安人糖尿病发病数据集,并总结了每个属性的分布。
1 2 3 4 5 6 7 |
# 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()函数创建所有属性的成对散点图。
例如,下面的代码片段将加载糖尿病数据集并创建数据集的散点图矩阵。
1 2 3 4 5 6 7 8 9 |
# 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课:通过预处理数据准备建模
您的原始数据可能未设置为最佳建模形式。
有时您需要对数据进行预处理,以便最好地将问题的固有结构呈现给建模算法。在今天的课程中,您将使用scikit-learn提供的预处理功能。
scikit-learn库提供了两个用于转换数据的标准习语。每种变换在不同的情况下都非常有用:拟合和多重变换以及组合的拟合与变换。
您可以使用多种技术来准备数据以进行建模。例如,尝试以下一些方法
-
使用比例和中心选项将数值数据标准化(例如,平均值为0,标准偏差为1)。
-
使用范围选项将数值数据标准化(例如,范围为0-1)。
-
探索更高级的功能工程,例如Binarizing。
例如,下面的代码段加载了Pima Indians糖尿病发病数据集,计算了标准化数据所需的参数,然后创建了输入数据的标准化副本。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 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课:使用重采样方法进行算法评估
用于训练机器学习算法的数据集称为训练数据集。用于训练算法的数据集不能用于为您提供有关新数据的模型准确性的可靠估计。这是一个大问题,因为创建模型的整个思路是对新数据进行预测。
您可以使用称为重采样方法的统计方法将训练数据集划分为子集,一些方法用于训练模型,而另一些则被保留,并用于估计看不见的数据的模型准确性。
今天课程的目标是练习使用scikit-learn中可用的不同重采样方法,例如:
-
将数据集分为训练集和测试集。
-
使用k倍交叉验证来估计算法的准确性。
-
使用留一法交叉验证来估计算法的准确性。
下面的代码段使用scikit-learn通过10倍交叉验证来评估Pima Indians糖尿病发作的Logistic回归算法的准确性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# 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指标。
下面的代码段演示了根据Pima Indians糖尿病发病数据计算LogLoss指标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 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课:抽查算法
您可能无法事先知道哪种算法对您的数据效果最好。
您必须使用反复试验的过程来发现它。我称之为现场检查算法。scikit-learn库提供了许多机器学习算法和工具的接口,以比较这些算法的估计准确性。
在本课程中,您必须练习抽查不同的机器学习算法。
-
对数据集进行抽查线性算法(例如线性回归,逻辑回归和线性判别分析)。
-
抽查数据集上的一些非线性算法(例如KNN,SVM和CART)。
-
抽查数据集上一些复杂的集成算法(例如随机森林和随机梯度增强)。
例如,下面的代码片段对Boston House Price数据集上的K最近邻居算法进行了抽查。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
# 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和scikit-learn中的机器学习算法的准确性。
-
在数据集上相互比较线性算法。
-
在数据集上相互比较非线性算法。
-
相互比较同一算法的不同配置。
-
创建比较算法的结果图。
下面的示例在皮马印第安人发病的糖尿病数据集中将Logistic回归和线性判别分析进行了比较。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# 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课:通过算法调整提高准确性
一旦找到一种或两种在数据集上表现良好的算法,您可能希望提高这些模型的性能。
提高算法性能的一种方法是将其参数调整为特定的数据集。
scikit-learn库提供了两种方法来搜索机器学习算法的参数组合。在今天的课程中,您的目标是练习每个。
-
使用您指定的网格搜索来调整算法的参数。
-
使用随机搜索调整算法的参数。
下面使用的代码段是一个示例,该示例使用网格搜索在Pima Indians糖尿病发病数据集上的Ridge回归算法。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# 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算法练习增强合奏。
-
通过将来自多个模型的预测组合在一起来练习投票合奏。
下面的代码段演示了如何在Pima Indians糖尿病发病数据集上使用随机森林算法(袋装决策树集合)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# 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回归模型,将其保存到文件中,之后再加载它以及对看不见的数据进行预测。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# 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 33% 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进行机器学习的起点。继续练习和发展自己的技能。
喜欢点下关注,你的关注是我写作的最大支持