鸢尾花数据集的多类分类
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 在结果中通过预测 1
或 0
起作用,但对于此 iris
数据集将需要根据指定对 0 or 1 or 2
进行分类。
问)我需要使用 StandardScalar 标准化数据吗?
问)这是如何工作的?我知道LR
通过预测YES
或NO
起作用,但在这里(iris
)我们必须预测0
或1
或2
Q) 如果LogisticRegression
也适用于多分类,那么我该如何优化我的上述代码,以便更好地预测我想尝试的其他多类数据集。
Q) 我需要转换我的y_train
还是需要进行任何类型的编码等才能使其工作?
如果有人能帮我解决这些问题,我将不胜感激。任何好的参考也值得赞赏。
【问题讨论】:
【参考方案1】:我是否需要使用 StandardScalar 标准化数据
一般来说,这称为Features Scaling,简而言之,有不止一个Scaler:
StandardScaler
:通常是你的首选,非常常用。它通过标准化数据(即居中)工作,将它们带到STD=1
和Mean=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中对数据集的划分方法