|
|
|
@ -82,7 +82,7 @@
|
|
|
|
|
|
|
|
|
|
你的数据已经清洗干净并已经准备好可以进行训练了,现在需要决定你想要使用的算法来完成这项任务。
|
|
|
|
|
|
|
|
|
|
Scikit_learn将分类任务归在了监督学习类别中,在这个类别中你将可以找到很多可以用来分类的方法。乍一看上去,有点[琳琅满目](https://scikit-learn.org/stable/supervised_learning.html)。以下这些方法都包含了分类技术:
|
|
|
|
|
Scikit_learn将分类任务归在了监督学习类别中,在这个类别中你可以找到很多可以用来分类的方法。乍一看上去,有点[琳琅满目](https://scikit-learn.org/stable/supervised_learning.html)。以下这些算法都可以用于分类:
|
|
|
|
|
|
|
|
|
|
- 线性模型(Linear Models)
|
|
|
|
|
- 支持向量机(Support Vector Machines)
|
|
|
|
@ -97,64 +97,64 @@ Scikit_learn将分类任务归在了监督学习类别中,在这个类别中
|
|
|
|
|
|
|
|
|
|
### 如何选择分类器?
|
|
|
|
|
|
|
|
|
|
那么,你应该选择哪一个分类器呢?一般来说,可以多选择几个并对比他们运行后的结果。Scikit-learn提供了各种算法(包括KNeighbors、 SVC two ways、 GaussianProcessClassifier、 DecisionTreeClassifier、 RandomForestClassifier、 MLPClassifier、 AdaBoostClassifier、 GaussianNB以及QuadraticDiscrinationAnalysis)的效果[对比](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html),并且将比较的结果进行了可视化的展示:
|
|
|
|
|
那么,你应该如何从中选择分类器呢?一般来说,可以选择多个分类器并对比他们的运行结果。Scikit-learn提供了各种算法(包括KNeighbors、 SVC two ways、 GaussianProcessClassifier、 DecisionTreeClassifier、 RandomForestClassifier、 MLPClassifier、 AdaBoostClassifier、 GaussianNB以及QuadraticDiscrinationAnalysis)的[对比](https://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html),并且将结果进行了可视化的展示:
|
|
|
|
|
|
|
|
|
|
![各分类器比较](../images/comparison.png)
|
|
|
|
|
> 图表来源于Scikit-learn的官方文档
|
|
|
|
|
|
|
|
|
|
> AutoML通过在云端运行这些对比非常完美地解决的选择算法的这个问题,使得你能够根据你的数据特性选择最佳的算法。试试点击[这里](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-15963-cxa)了解更多。
|
|
|
|
|
> AutoML通过在云端运行这些算法并进行了对比,非常巧妙地解决的算法选择的问题,能帮助你根据数据集的特点来选择最佳的算法。试试点击[这里](https://docs.microsoft.com/learn/modules/automate-model-selection-with-azure-automl/?WT.mc_id=academic-15963-cxa)了解更多。
|
|
|
|
|
|
|
|
|
|
### 一种更好的方法来选择分类器
|
|
|
|
|
### 另外一种效果更佳的分类器选择方法
|
|
|
|
|
|
|
|
|
|
不过,比起无脑地猜测,你可以下载这份[机器学习作弊表(cheatsheet)](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-15963-cxa),对各算法进行对比,这是一个选择算法更有效的办法。在表中我们可以发现对于本课程中涉及的多类型的分类任务,可以有以下这些选择:
|
|
|
|
|
比起无脑地猜测,你可以下载这份[机器学习小抄(cheatsheet)](https://docs.microsoft.com/azure/machine-learning/algorithm-cheat-sheet?WT.mc_id=academic-15963-cxa)。这里面将各算法进行了比较,能更有效地帮助我们选择算法。根据这份小抄,我们可以找到要完成本课程中涉及的多类型的分类任务,可以有以下这些选择:
|
|
|
|
|
|
|
|
|
|
![多类型问题作弊表](../images/cheatsheet.png)
|
|
|
|
|
> 微软算法作弊表中关于多类型分类任务可选算法的部分
|
|
|
|
|
> 微软算法小抄中部分关于多类型分类任务可选算法
|
|
|
|
|
|
|
|
|
|
✅ 下载这份作弊表,打印出来,挂在你的墙上吧!
|
|
|
|
|
✅ 下载这份小抄,并打印出来,挂在你的墙上吧!
|
|
|
|
|
|
|
|
|
|
### 选择的过程
|
|
|
|
|
### 选择的流程
|
|
|
|
|
|
|
|
|
|
让我们看看根据我们所有的限制条件依次判断下各种方法的可行性:
|
|
|
|
|
让我们根据所有限制条件依次对各种算法的可行性进行判断:
|
|
|
|
|
|
|
|
|
|
- **神经网络(Neural Network)太过复杂了**。我们的数据很清晰但数据量比较小,此外我们是通过notebook在本地进行训练,神经网络对于这个任务来说过于复杂了。
|
|
|
|
|
- **二分类法(two-class classifier)不可行**。我们不能使用二分类法,所以这就排除了一对多(one-vs-all)算法。
|
|
|
|
|
- **决策树以及逻辑回归可行**。决策树应该是有用的,此外也可以使用逻辑回归来处理多类型数据。
|
|
|
|
|
- **多类型增强决策树是用于解决其他问题的**. 多类型增强决策树最适合非参数化的任务,即任务目标是建立一个排序,这对我们当前的任务并没有作用。
|
|
|
|
|
- **神经网络(Neural Network)太过复杂了**。我们的数据很清晰但数据量比较小,此外我们是通过notebook在本地进行训练的,神经网络对于这个任务来说过于复杂了。
|
|
|
|
|
- **二分类法(two-class classifier)是不可行的**。我们不能使用二分类法,所以这就排除了一对多(one-vs-all)算法。
|
|
|
|
|
- **可以选择决策树以及逻辑回归算法**。决策树应该是可行的,此外也可以使用逻辑回归来处理多类型数据。
|
|
|
|
|
- **多类型增强决策树是用于解决其他问题的**. 多类型增强决策树最适合的是非参数化的任务,即任务目标是建立一个排序,这对我们当前的任务并没有作用。
|
|
|
|
|
|
|
|
|
|
### 使用Scikit-learn
|
|
|
|
|
|
|
|
|
|
我们将会使用Scikit-learn来对我们的数据进行分析。然而,在Scikit-learn中使用逻辑回归也有很很多方法。可以看一看逻辑回归算法需要[传递的参数](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression)。
|
|
|
|
|
我们将会使用Scikit-learn来对我们的数据进行分析。然而在Scikit-learn中使用逻辑回归也有很多方法。可以先了解一下逻辑回归算法需要[传递的参数](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression)。
|
|
|
|
|
|
|
|
|
|
当我们需要Scikit-learn进行逻辑回归运算时,`multi_class` 以及 `solver`是最重要的两个参数,因此我们需要特别说明一下。 `multi_class` 的值是分类任务要求的某一种特定的行为。`solver`的值是我们需要使用的算法。并不是所有的solvers都可以匹配`multi_class`的值的。
|
|
|
|
|
当我们需要Scikit-learn进行逻辑回归运算时,`multi_class` 以及 `solver`是最重要的两个参数,因此我们需要特别说明一下。 `multi_class` 是分类方式选择参数,而`solver`优化算法选择参数。值得注意的是,并不是所有的solvers都可以与`multi_class`参数进行匹配的。
|
|
|
|
|
|
|
|
|
|
根据文档,在多类型问题中,训练的算法应:
|
|
|
|
|
根据官方文档,在多类型分类问题中:
|
|
|
|
|
|
|
|
|
|
- **使用“一对其余”(OvR)策略(scheme)**, 当`multi_class`被设置为`ovr`时
|
|
|
|
|
- **使用交叉熵损失(cross entropy loss)**, 当`multi_class`被设置为`multinomial` (目前,`multinomial`只支持‘lbfgs’, ‘sag’, ‘saga’以及‘newton-cg’等 solver)时。
|
|
|
|
|
- 当`multi_class`被设置为`ovr`时,将使用 **“一对其余”(OvR)策略(scheme)**。
|
|
|
|
|
- 当`multi_class`被设置为`multinomial`时,则使用的是**交叉熵损失(cross entropy loss)** 作为损失函数。(注意,目前`multinomial`只支持‘lbfgs’, ‘sag’, ‘saga’以及‘newton-cg’等solver作为损失函数的优化方法)
|
|
|
|
|
|
|
|
|
|
> 🎓 其中“scheme”可以是“ovr(one-vs-rest)”也可以是“multinomial”。 因为逻辑回归本来是设计来用于进行二分类任务的,这两个scheme都可以使得逻辑回归能更好的支持多类型分类任务。[来源](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
|
|
|
|
|
> 🎓 在本课程的任务中“scheme”可以是“ovr(one-vs-rest)”也可以是“multinomial”。因为逻辑回归本来是设计来用于进行二分类任务的,这两个scheme参数的选择都可以使得逻辑回归很好的完成多类型分类任务。[来源](https://machinelearningmastery.com/one-vs-rest-and-one-vs-one-for-multi-class-classification/)
|
|
|
|
|
|
|
|
|
|
> 🎓 “solver”被定义为是"用于解决优化问题的算法"。[来源](https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LogisticRegression.html?highlight=logistic%20regressio#sklearn.linear_model.LogisticRegression).
|
|
|
|
|
|
|
|
|
|
Scikit-learn提供了以下这个表格来解释solver是如何应对的不同的数据结构所带来的不同的挑战的:
|
|
|
|
|
Scikit-learn提供了以下这个表格来解释各种solver是如何应对的不同的数据结构所带来的不同的挑战的:
|
|
|
|
|
|
|
|
|
|
![solvers](../images/solvers.png)
|
|
|
|
|
|
|
|
|
|
## 练习 - 分割数据
|
|
|
|
|
|
|
|
|
|
你刚刚在上一节课中学习了逻辑回归,因此我们可以聚焦于此,来演练一下如何进行第一个模型的训练。首先,需要通过调用`train_test_split()`可以把你的数据分割成训练集和测试集:
|
|
|
|
|
因为你刚刚在上一节课中学习了逻辑回归,我们这里就通过逻辑回归算法,来演练一下如何进行你的第一个机器学习模型的训练。首先,需要通过调用`train_test_split()`方法可以把你的数据分割成训练集和测试集:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisines_label_df, test_size=0.3)
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 练习 - 应用逻辑回归
|
|
|
|
|
## 练习 - 调用逻辑回归算法
|
|
|
|
|
|
|
|
|
|
接着,你需要决定选用什么 _scheme_ 以及 _solver_ 来进行我们这个多类型分类的案例。这里我们使用LogisticRegression方法,并设置相应的multi_class参数,同时将solver设置为**liblinear**来进行模型训练。
|
|
|
|
|
接下来,你需要决定选用什么 _scheme_ 以及 _solver_ 来进行我们这个多类型分类的案例。在这里我们使用LogisticRegression方法,并设置相应的multi_class参数,同时将solver设置为**liblinear**来进行模型训练。
|
|
|
|
|
|
|
|
|
|
1. 创建逻辑回归,并将multi_class设置为`ovr`,同时将solver设置为 `liblinear`:
|
|
|
|
|
1. 创建一个逻辑回归模型,并将multi_class设置为`ovr`,同时将solver设置为 `liblinear`:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
lr = LogisticRegression(multi_class='ovr',solver='liblinear')
|
|
|
|
@ -164,13 +164,13 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
|
|
|
|
|
print ("Accuracy is {}".format(accuracy))
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
✅ 也可以试试其他solver比如`lbfgs`, 这通常是默认的设置
|
|
|
|
|
✅ 也可以试试其他solver比如`lbfgs`, 这也是默认参数
|
|
|
|
|
|
|
|
|
|
> 注意, 使用Pandas的[`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) 函数可以在需要的时候将你的数据进行降维
|
|
|
|
|
> 注意, 使用Pandas的[`ravel`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.Series.ravel.html) 方法可以在需要的时候将你的数据进行降维
|
|
|
|
|
|
|
|
|
|
计算结果准确率高达了**80%**!
|
|
|
|
|
运算之后,可以看到准确率高达了**80%**!
|
|
|
|
|
|
|
|
|
|
1. 你也可以通过查看某一行数据(比如第50行)来观察到模型运行的情况:
|
|
|
|
|
1. 你也可以通过查看某一行数据(比如第50行)来观测到模型运行的情况:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
print(f'ingredients: {X_test.iloc[50][X_test.iloc[50]!=0].keys()}')
|
|
|
|
@ -184,9 +184,9 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
|
|
|
|
|
cuisine: indian
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
✅ 试试不同的行索引来检查一下结果吧
|
|
|
|
|
✅ 试试不同的行索引来检查一下计算的结果吧
|
|
|
|
|
|
|
|
|
|
1. 让我们再深入研究一下,你可以检查一下本次预测的准确率:
|
|
|
|
|
1. 我们可以再进行一部深入的研究,检查一下本轮预测结果的准确率:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
test= X_test.iloc[50].values.reshape(-1, 1).T
|
|
|
|
@ -210,7 +210,7 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
|
|
|
|
|
|
|
|
|
|
✅ 你能解释下为什么模型会如此确定这是一道印度菜么?
|
|
|
|
|
|
|
|
|
|
1. 就和你在回归的课程中所做的一样,通过输出分类的报告,我们可以得到更多的细节:
|
|
|
|
|
1. 和你在之前的回归的课程中所做的一样,我们也可以通过输出分类的报告得到关于模型的更多的细节:
|
|
|
|
|
|
|
|
|
|
```python
|
|
|
|
|
y_pred = model.predict(X_test)
|
|
|
|
@ -230,7 +230,7 @@ X_train, X_test, y_train, y_test = train_test_split(cuisines_feature_df, cuisine
|
|
|
|
|
|
|
|
|
|
## 挑战
|
|
|
|
|
|
|
|
|
|
在本课程中,你使用了清洗后的数据建立了一个机器学习的模型,能够根据一系列的配料来预测菜品来自于哪个国家。请再花点时间阅读一下Scikit-learn所提供的可以用来分类数据的其他选择。同时也可以深入研究一下“solver”的概念并尝试一下理解其背后的原理。
|
|
|
|
|
在本课程中,你使用了清洗后的数据建立了一个机器学习的模型,这个模型能够根据输入的一系列的配料来预测菜品来自于哪个国家。请再花点时间阅读一下Scikit-learn所提供的关于可以用来分类数据的其他方法的资料。此外,你也可以深入研究一下“solver”的概念并尝试一下理解其背后的原理。
|
|
|
|
|
|
|
|
|
|
## [课后测验](https://jolly-sea-0a877260f.azurestaticapps.net/quiz/22/)
|
|
|
|
|
## 回顾与自学
|
|
|
|
|