在传递给 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_data
和y_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_data
和y_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 分类器之前将字符串数据转换为浮点数的主要内容,如果未能解决你的问题,请参考以下文章