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机器学习存储库下载并使用它们进行练习。
- 练习使用标准库中的CSV.read()将CSV文件加载到Python中。
- 练习使用NumPy和numpy.loadtxt()函数加载CSV文件。
- 练习使用Pandas和 pandas.read_csv() 函数加载CSV文件。
为了让你开始学习,下面是一个片段,它将使用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进行机器学习之旅的开始。不断练习和发展你的技能。