在传递给 SVM 分类器之前将字符串数据转换为浮点数

Posted

技术标签:

【中文标题】在传递给 SVM 分类器之前将字符串数据转换为浮点数【英文标题】:Converting string data to float before passing to SVM classifier 【发布时间】:2018-02-21 12:22:16 【问题描述】:

我有一个数据集如下:

X_data = 

BankNum   |  ID | 

00987772  | AB123 | 
00987772  | AB123 |
00987772  | AB123 |
00987772  | ED245 |
00982123  | GH564 |

还有一个:

y_data =

ID  | Labels

AB123 | High
ED245 | Low
GH564 | Low

我正在做以下事情:

from sklearn import svm
from sklearn import metrics
import numpy as np

clf = svm.SVC(gamma=0.001, C=100., probability=True)
X_train, X_test, y_train, y_test = train_test_split(X_data, y_data, test_size=0.20, random_state=42)
clf.fit(X_train, y_train)

predicted = clf.predict(X_test)

但我想知道在我做clf.fit() 之前如何将这个X_data 转换为浮动?在这种情况下我可以使用DictVectorizer 吗?如果是,那我该如何使用呢?

另外,我通过train_test_split 传递X_datay_data 以找出预测准确度,但它会正确拆分吗?就像在 X_data 中从 y_data 获取正确的 Label ID 一样?

更新:

谁能告诉我我是否正确地执行了以下操作?

new_df = pd.merge(df, df3, on="ID")
columns = ['BankNum', 'ID']
labels = new_df['Labels']
le = LabelEncoder()
labels = le.fit_transform(labels)
X_train, X_test, y_train, y_test = train_test_split(new_df[columns], labels, test_size=0.25, random_state=42)
X_train.fillna( 'NA', inplace = True )
X_test.fillna( 'NA', inplace = True )
x_cat_train = X_train.to_dict( orient = 'records' )
x_cat_test = X_test.to_dict( orient = 'records' )
vectorizer = DictVectorizer( sparse = False )
vec_x_cat_train = vectorizer.fit_transform( x_cat_train )
vec_x_cat_test = vectorizer.transform( x_cat_test )
x_train = vec_x_cat_train
x_test = vec_x_cat_test
clf = svm.SVC(gamma=0.001, C=100., probability=True)
clf.fit(x_train, y_train)

【问题讨论】:

X_datay_data 数据帧吗?它们来自文件吗?当您第一次阅读它们时,您可以将它们解析为浮点数。 @Antimony 是的,它们是数据框。我正在从数据库中获取 X_data。 您究竟想如何将特征表示为 float btw?似乎ID 不是浮点类型。似乎X_data 的前 3 行只是重复同样的事情。 请参阅我的问题中的更新。至于 X_data 的前 3 行重复,是的,因为我只从数据库中提取某些列,它们的其他列具有不同的值。但是,我们可以将两个数据帧合并在一起,然后只使用 df[Labels] 代替 y_data? 是的,合并可能是一个很好的建议,然后您需要使用不同的技术(如 LableBinarizer、LabelEncoding)将标签转换为浮动,在this 中找到更多相关信息我不确定Dictcectorizer 正是您所需要的 【参考方案1】:

根据我们在评论中讨论的内容,我的建议是首先合并 id 列上的 x_data 和 y_data 数据集:

dataset = pd.merge(left=x_data, right=y_data, on='index')

您可以使用 np.astype 将 BANKacount 列转换为浮动:

dataset['Bank_Num'] = dataset.Bank_Num.astype(np.float128)

NB(更新):如果标签_encoder包含一些纯字符串值,它也可以用于Bank_Num:

dataset['Bank_Num'] = le.fit_transform(dataset.Bank_Num)

ID 列通过使用标签编码器来获取它的 int 表示:

from sklearn.preprocessing import LabelEncoder,LabelBinarizer
le = LabelEncoder()
dataset['index'] = le.fit_transform(dataset.index)

和使用 labelBinarizer 的 y 标签:

lb = LabelBinarizer()
dataset['label'] = lb.fit_transform(dataset.label)

现在您有了一个包含 int 和 float 的完整数据集,并且您的 SVC 可以很好地使用它,但在您需要拆分之前:

测试大小低于训练大小是个好主意,最好使用小于 0.5 的值作为 test_size 了解更多关于训练集和测试集大小的信息 @987654321 @

像这样:

X_train, X_test, y_train, y_test = train_test_split(dataset[['index','Bank_Num']], dataset.label, test_size=0.25, random_state=42)

有了这个,您现在可以在没有任何问题的情况下训练您的分类器:

clf.fit(X_train, y_train)

注意:在我的代码中索引相当于你的 ID

让我知道这是否有帮助以及如何改进我的答案

【讨论】:

测试大小可以是(0, 1.0)。您对 test_size 的评论不正确。 感谢我编辑了它,如果我是正确的,请检查并批准,否则告诉我我还能编辑什么 是的,这更合理。我只是不喜欢 ML 的一些新手可能会与您以前的版本混淆。 @EspoirMurhabazi 太棒了!但是我在上面的问题中输入的代码有问题吗? @EspoirMurhabazi 谢谢!这似乎可行 :) 但是,您能否告诉我,如果我想使用“名称”列而不是银行编号,我是否也使用标签编码器?

以上是关于在传递给 SVM 分类器之前将字符串数据转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章

图像识别之初探SVM分类器

如何将浮点矩阵作为 2D 纹理传递给片段着色器?

SciKit One-class SVM 分类器训练时间随着训练数据的大小呈指数增长

svm是一种典型的啥模型

将 svm 分类器设置为 HOG 检测器

sklearn 绘制来自 SVM 分类器的结果