使用 SVM 进行分类
Classification using SVM
为了尝试对文本进行分类,我想使用 SVM。
我想将测试数据分类到标签之一(health/adult)
训练&测试数据为文本文件
我正在使用 python 的 scikit 库。
当我将文本保存到 txt 文件时,我将其编码为 utf-8
这就是为什么我在片段中解码它们。
这是我尝试的代码
String = String.decode('utf-8')
String2 = String2.decode('utf-8')
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),
token_pattern=r'\b\w+\b', min_df=1)
X_2 = bigram_vectorizer.fit_transform(String2).toarray()
X_1 = bigram_vectorizer.fit_transform(String).toarray()
X_train = np.array([X_1,X_2])
print type(X_train)
y = np.array([1, 2])
clf = SVC()
clf.fit(X_train, y)
#prepare test data
print(clf.predict(X))
这是我遇到的错误
File "/Users/guru/python_projects/implement_LDA/lda/apply.py", line 107, in <module>
clf.fit(X_train, y)
File "/Users/guru/python_projects/implement_LDA/lda/lib/python2.7/site-packages/sklearn/svm/base.py", line 150, in fit
X = check_array(X, accept_sparse='csr', dtype=np.float64, order='C')
File "/Users/guru/python_projects/implement_LDA/lda/lib/python2.7/site-packages/sklearn/utils/validation.py", line 373, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence.
当我搜索错误时,我找到了一些结果,但它们甚至没有帮助。我认为我在应用 SVM 模型时在逻辑上是错误的。有人可以给我提示吗?
您必须合并样本,将它们矢量化,然后拟合分类器。像这样:
String = String.decode('utf-8')
String2 = String2.decode('utf-8')
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),
token_pattern=r'\b\w+\b', min_df=1)
X_train = bigram_vectorizer.fit_transform(np.array([String, String2]))
print type(X_train)
y = np.array([1, 2])
clf = SVC()
clf.fit(X_train, y)
#prepare test data
print(clf.predict(bigram_vectorizer.transform(np.array([X1, X2, ...]))))
但是 2 个样本的数据量非常少,因此您的预测可能不准确。
已编辑:
您还可以使用流水线将转换和分类合二为一。
from sklearn.pipeline import Pipeline
print type(X_train) # Should be a list of texts length 100 in your case
y_train = ... # Should be also a list of length 100
clf = Pipeline([
('transformer', CountVectorizer(...)),
('estimator', SVC()),
])
clf.fit(X_train, y_train)
X_test = np.array(["sometext"]) # array of test texts length = 1
print(clf.predict(X_test))
为了尝试对文本进行分类,我想使用 SVM。 我想将测试数据分类到标签之一(health/adult) 训练&测试数据为文本文件
我正在使用 python 的 scikit 库。
当我将文本保存到 txt 文件时,我将其编码为 utf-8
这就是为什么我在片段中解码它们。
这是我尝试的代码
String = String.decode('utf-8')
String2 = String2.decode('utf-8')
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),
token_pattern=r'\b\w+\b', min_df=1)
X_2 = bigram_vectorizer.fit_transform(String2).toarray()
X_1 = bigram_vectorizer.fit_transform(String).toarray()
X_train = np.array([X_1,X_2])
print type(X_train)
y = np.array([1, 2])
clf = SVC()
clf.fit(X_train, y)
#prepare test data
print(clf.predict(X))
这是我遇到的错误
File "/Users/guru/python_projects/implement_LDA/lda/apply.py", line 107, in <module>
clf.fit(X_train, y)
File "/Users/guru/python_projects/implement_LDA/lda/lib/python2.7/site-packages/sklearn/svm/base.py", line 150, in fit
X = check_array(X, accept_sparse='csr', dtype=np.float64, order='C')
File "/Users/guru/python_projects/implement_LDA/lda/lib/python2.7/site-packages/sklearn/utils/validation.py", line 373, in check_array
array = np.array(array, dtype=dtype, order=order, copy=copy)
ValueError: setting an array element with a sequence.
当我搜索错误时,我找到了一些结果,但它们甚至没有帮助。我认为我在应用 SVM 模型时在逻辑上是错误的。有人可以给我提示吗?
您必须合并样本,将它们矢量化,然后拟合分类器。像这样:
String = String.decode('utf-8')
String2 = String2.decode('utf-8')
bigram_vectorizer = CountVectorizer(ngram_range=(1, 2),
token_pattern=r'\b\w+\b', min_df=1)
X_train = bigram_vectorizer.fit_transform(np.array([String, String2]))
print type(X_train)
y = np.array([1, 2])
clf = SVC()
clf.fit(X_train, y)
#prepare test data
print(clf.predict(bigram_vectorizer.transform(np.array([X1, X2, ...]))))
但是 2 个样本的数据量非常少,因此您的预测可能不准确。
已编辑:
您还可以使用流水线将转换和分类合二为一。
from sklearn.pipeline import Pipeline
print type(X_train) # Should be a list of texts length 100 in your case
y_train = ... # Should be also a list of length 100
clf = Pipeline([
('transformer', CountVectorizer(...)),
('estimator', SVC()),
])
clf.fit(X_train, y_train)
X_test = np.array(["sometext"]) # array of test texts length = 1
print(clf.predict(X_test))