Python的sklearn(DecisionTreeClassifier,SVM)的区别?

Posted

技术标签:

【中文标题】Python的sklearn(DecisionTreeClassifier,SVM)的区别?【英文标题】:Difference between Python's sklearn (DecisionTreeClassifier, SVM)? 【发布时间】:2017-12-20 23:37:01 【问题描述】:

我是机器学习的新手——特别是分类技术。

我已经阅读了一些在线教程,我正在使用iris data set。我尝试使用

将数据集拆分为训练和测试
train, test = train_test_split(df,
                               test_size=test_size,
                               train_size=train_size,
                               random_state=random_state)

随后,我找到了两种拟合模型的方法(DecisionTreeClassifier & SVM):

dt = DecisionTreeClassifier(min_samples_split=20, random_state=99)
clf = svm.SVC(kernel='linear', C=1)

两种模型都允许我使用 .fit() 和 .score() 方法。我尝试对具有不同大小和随机状态的数据进行重新采样,但我得到的 2 个模型的得分完全相同,均为 0.9852。难道我做错了什么?

另外,是否需要将我的目标变量(“类”)转换为here 所述的数值?我尝试使用原始字符串值拟合数据框,并且得到了相同的结果。非常感谢任何帮助!

【问题讨论】:

那个代码不完整... 我使用相同的数据发布了一个答案并解释了您所犯的错误 【参考方案1】:

train_test_split 的正确使用方式如下:

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

#Load Iris data, X: features and y:target/labels
df = load_iris()
y = df.target
X = df.data

#Split the data
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state= 99)

#Fit the 2 classifiers
dt = DecisionTreeClassifier(min_samples_split=20, random_state=99)
clf = SVC(kernel='linear', C=1)

dt.fit(X_train, y_train)
y_predicted_dt = dt.predict(X_test)
scores_dt = accuracy_score(y_test, y_predicted_dt)
print(scores_dt)

clf.fit(X_train, y_train)
y_predicted_clf = clf.predict(X_test)
scores_clf = accuracy_score(y_test, y_predicted_clf)
print(scores_clf)

结果:

#Accuracy of dt classifier
0.933333333333

#Accuracy of clf classifier
0.983333333333

底线:

在您的情况下,您只能将train_test_split 中的df 作为X 传递。

您不需要转换 thr 类。只需使用accuracy_scorecross_val_score 函数即可。

【讨论】:

他在train_test_split 中使用df,由于他的代码不完整,我不会说他只在其中传递了X。也许他在训练时打电话给train.datatrain.target,以及test.datatest.target。也许不是。 @VivekKumar 可能是这种情况,但因为他说“我尝试重新采样具有不同大小和随机状态的数据,但我得到的 2 个模型的分数完全相同,均为 0.9852”,我似乎认为我的答案接近发生的事情。让我们等待提问者的反馈。 @sera 谢谢你的回答!我想问一下是否需要将我的“类”列从 iris 数据集从字符串转换为整数,以便 DT 或 SVM 工作? 你好。对于虹膜数据,类是 y。 y 应该是一个 numpy 数组,它的大小应该是(样本数,)。另一方面,X 的大小应该是(样本数,特征数)。所以对于虹膜 y 是 (159, ) 而 X 是 (150,4)。两个 numpy 数组。我刚试过 SVC 工作正常

以上是关于Python的sklearn(DecisionTreeClassifier,SVM)的区别?的主要内容,如果未能解决你的问题,请参考以下文章

python怎么用sklearn包进行聚类

Python数模笔记-Sklearn 介绍

python sklearn 机器学习sklearn.model_selection 介绍

python库之——sklearn

python 15 sklearn

sklearn:Python语言开发的通用机器学习库