鸢尾花数据集的多类分类

Posted

技术标签:

【中文标题】鸢尾花数据集的多类分类【英文标题】:Multiclass classification on iris dataset 【发布时间】:2019-03-06 08:30:35 【问题描述】:

我知道我用一个问题问了很多问题,但这些是我在将Logistic Regression 用于Iris Dataset 时遇到的疑问

这是我在 iris 数据集上使用 LogisticRegression 的代码。

iris = datasets.load_iris()
X, y = iris.data, iris.target
x_train, x_test, y_train, y_test = train_test_split(X, y, stratify=y, random_state= 81,
                                                           test_size=0.3)
logreg = LogisticRegression()
logreg.fit(x_train, y_train)
pred = logreg.predict(x_test)
accuracy_score(y_test, pred) # this gives accuracy
0.95555

我知道 LogisticRegression 在结果中通过预测 10 起作用,但对于此 iris 数据集将需要根据指定对 0 or 1 or 2 进行分类。

问)我需要使用 StandardScalar 标准化数据吗?

问)这是如何工作的?我知道LR 通过预测YESNO 起作用,但在这里(iris)我们必须预测012

Q) 如果LogisticRegression 也适用于多分类,那么我该如何优化我的上述代码,以便更好地预测我想尝试的其他多类数据集。

Q) 我需要转换我的y_train 还是需要进行任何类型的编码等才能使其工作?

如果有人能帮我解决这些问题,我将不胜感激。任何好的参考也值得赞赏。

【问题讨论】:

【参考方案1】:

我是否需要使用 StandardScalar 标准化数据

一般来说,这称为Features Scaling,简而言之,有不止一个Scaler

    StandardScaler:通常是你的首选,非常常用。它通过标准化数据(即居中)工作,将它们带到STD=1Mean=0。它会受到异常值的影响,并且仅应在您的数据具有 Gaussian-Like Distribution 时使用。 MinMaxScaler:通常用于将所有数据点置于特定范围内(例如 [0-1])。它受到异常值的影响很大,仅仅是因为它使用了Range。 RobustScaler:它对异常值“鲁棒”,因为它根据 quantile range 缩放数据。但是,您应该知道,缩放数据中仍然存在异常值。 MaxAbsScaler:主要用于sparse data。 Unit Normalization:基本上它为每个样本缩放向量以具有单位范数,与样本的分布无关。

现在,根据经验,我们通常由于以下一个(或多个)原因而对特征进行缩放:

    某些算法需要对特征进行缩放,例如神经网络。 (为了避免例如Vanishing Gradient Descent),另一个例子是当我们在SVM中使用RBF Kernel ...等。 功能扩展改进/加速convergence。 当特征在量级、单位和范围(例如 5kg 和 5000gms)上有很大差异时,因为我们不希望算法错误地认为一个特征更重要(即对模型)比另一个。

如您所见,特征缩放与 Y 中的类数无关。


..但是对于这个 iris 数据集,需要基于 0 或 1 或 2 进行分类 在指定...这是如何工作的?我知道 LR 通过预测 YES 或 NO 起作用 但在这里(iris)我们必须预测 0 或 1 或 2

嗯,与Binary Classification 相比,这称为Multiclass Classification。

这里的基本思想是 Scikit LogisticRegresser 使用 One-vs-Rest (OvR) 方案 -默认情况下- 来解决它(又名 One-vs-All)像这样工作(用我能想到的最简单的话):

为每个类 i 训练一个逻辑回归分类器,以预测 y = i 的概率。在一个新的输入x 上,进行预测,选择具有最大似然性(即最高假设结果)的类i,换句话说,它将多类分类问题简化为m多个二元分类问题,更多详情请看here。


如果LogisticRegression 也适用于多重分类,那么 如何优化我的上述代码以更好地预测其他代码 我想尝试的多类数据集。

好吧,你不必做任何优化,你抽象地使用了 Scikit 库,所以它会负责优化,实际上它通过使用 solver em>,求解器之间的比较,看here(我在***上写过一次)。


我需要转换我的 y_train 还是需要做任何类型的 编码等让它工作?

特别是对于您的情况(即虹膜数据集),答案是,因为它已经为您准备好了,但是如果因变量中的值 (即Y) 不是数字,那么您应该将它们转换为数字,例如,如果您有4 个类,则用一个数字(例如0、1、2、3)表示每个类。 (example of replacing the 0's and 1's by the words male and female)(你应该做相反的事情,但你从那里得到了这个想法:D)。


我建议您从一个非常好的参考资料开始,它将消除您的所有疑虑是 Andrew NG 教授的 this 课程。

【讨论】:

我只有一个疑问。LogisticRegression() 中有一个参数叫multi_class?我可以使用它吗?它有什么用?我在想它可能与多类分类有关。 @user2475 这个multi_class 参数只不过是在OvR 方案或multinomial 方案之间进行选择。默认为ovr,我在回答中对此进行了解释,您真的不必担心第二个选项,但如果您是古玩,请查看here 和here。【参考方案2】:

“我需要使用 StandardScalar 标准化数据吗?”

标准化数据集的目的是为了让模型收敛得更快,就这个问题而言,它被认为是相对简单的,因此标准化不是必需的,你可以这样做

“这是如何工作的?我知道 LR 通过预测 YES 或 NO 来工作,但在这里(iris)我们必须预测 0 或 1 或 2”

基本上为多类回归创建了多个模型,在这种情况下为 3,每个模型将预测每个类的 YES 或 NO,所以基本上你测试所有类的测试时间数据集,以及概率最高的类是然后退还给你

“我需要转换我的 y_train 还是需要进行任何类型的编码等才能使其工作?”

不,您可以按原样传递 y_train 数据

“当我们使用 LogisticRegression 进行多分类时,要使用哪些评分参数。这些评分参数与单类分类有何不同(o 或 1)”

我真的没有得到这个问题,但你应该创建一个这样的逻辑回归模型: logreg = LogisticRegression(C=1e5, solver='lbfgs', multi_class='multinomial')

您的具体应用示例可以在这里找到http://scikit-learn.org/stable/auto_examples/linear_model/plot_iris_logistic.html

【讨论】:

以上是关于鸢尾花数据集的多类分类的主要内容,如果未能解决你的问题,请参考以下文章

如何处理多类文本分类中不在训练集中的测试集标签?

第五节 算法的分类介绍和数据集的划分

案例:鸢尾花种类预测--知道sklearn中对数据集的划分方法

处理Auto-Sklearn中多类分类的不平衡数据集的最佳方法

大型数据集的多标签分类

基于R语言的分类、聚类研究