在传递给 SVM 分类器之前将字符串数据转换为浮点数
Converting string data to float before passing to SVM classifier
我有一个数据集如下:
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
吗?如果是,那我该如何使用它?
此外,我将 X_data
和 y_data
传递给 train_test_split
以找出预测准确度,但它会正确拆分吗?正如从 y_data
?
中为 X_data
中的 ID
选择正确的 Label
更新:
有人可以告诉我以下操作是否正确吗?
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)
根据我们在评论中讨论的内容,我的建议是首先合并 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 可以很好地处理它,但在你需要拆分之前:
测试大小小于训练大小是个好主意,对于 test_size 最好使用小于 0.5 的值 find more关于训练集和测试集大小 here
像这样:
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
让我知道这是否有帮助以及我如何改进我的回答
我有一个数据集如下:
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
吗?如果是,那我该如何使用它?
此外,我将 X_data
和 y_data
传递给 train_test_split
以找出预测准确度,但它会正确拆分吗?正如从 y_data
?
X_data
中的 ID
选择正确的 Label
更新:
有人可以告诉我以下操作是否正确吗?
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)
根据我们在评论中讨论的内容,我的建议是首先合并 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 可以很好地处理它,但在你需要拆分之前:
测试大小小于训练大小是个好主意,对于 test_size 最好使用小于 0.5 的值 find more关于训练集和测试集大小 here
像这样:
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
让我知道这是否有帮助以及我如何改进我的回答