我正在尝试使用sci-kit learn 0.17进行多标签分类,我的数据看起来像这样
训练数据
Col1 Col2asd dfgfg [1,2,3]poioi oiopiop [4]
测试数据
Col1 asdas gwergwger rgrgh hrhrh
到目前为止我的代码是
import numpy as npfrom sklearn import svm, datasetsfrom sklearn.metrics import precision_recall_curvefrom sklearn.metrics import average_precision_scorefrom sklearn.cross_validation import train_test_splitfrom sklearn.preprocessing import label_binarizefrom sklearn.multiclass import OneVsRestClassifierdef getLabels(): traindf = pickle.load(open("train.pkl","rb")) X = traindf['Col1'] y = traindf['Col2'] # 将输出二值化 from sklearn.preprocessing import MultiLabelBinarizer y=MultiLabelBinarizer().fit_transform(y) random_state = np.random.RandomState(0) # 分割成训练和测试数据 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=random_state) # 运行分类器 from sklearn import svm, datasets classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True, random_state=random_state)) y_score = classifier.fit(X_train, y_train).decision_function(X_test)
但现在我得到了
ValueError: could not convert string to float: <value of Col1 here>
在
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
我是否也需要对X进行二值化处理?为什么我需要将X维度转换为浮点数?
回答:
是的,你必须将X也转换为数值表示(不一定是二进制的),就像y一样。这是因为所有机器学习方法都是在数字矩阵上操作的。
具体如何做呢?如果Col1中的每个样本可以包含不同的单词(即它代表一些文本),你可以使用CountVectorizer来转换该列
from sklearn.feature_extraction.text import CountVectorizercol1 = ["cherry banana", "apple appricote", "cherry apple", "banana apple appricote cherry apple"]cv = CountVectorizer()cv.fit_transform(col1) #<4x4 sparse matrix of type '<class 'numpy.int64'>'# with 10 stored elements in Compressed Sparse Row format>cv.fit_transform(col1).toarray()#array([[0, 0, 1, 1],# [1, 1, 0, 0],# [1, 0, 0, 1],# [2, 1, 1, 1]], dtype=int64)