Python-Scikit。使用 SVM 训练和测试数据
Python-Scikit. Training and testing data using SVM
我正在使用 SVM (scikit) 训练和测试数据。我正在训练 SVM 并从中准备泡菜。然后,我用那个 pickle 来测试我的系统。首先,我分别读取变量 train_data
和 test_data
中的训练数据和测试数据。
之后,我用于训练的代码是:
vectorizer = TfidfVectorizer(max_df = 0.8,
sublinear_tf=True,
use_idf=True)
train_vectors = vectorizer.fit_transform(train_data)
test_vectors = vectorizer.transform(test_data)
classifier_rbf = svm.SVC()
classifier_rbf.fit(train_vectors, train_labels)
from sklearn.externals import joblib
joblib.dump(classifier_rbf, 'pickl/train_rbf_SVM.pkl',1)
再次测试时,我正在分别读取变量 train_data
和 test_data
中的训练数据和测试数据。我用于测试的代码是:
vectorizer = TfidfVectorizer(max_df = 0.8,
sublinear_tf=True,
use_idf=True)
train_vectors = vectorizer.fit_transform(train_data)
test_vectors = vectorizer.transform(test_data)
from sklearn.externals import joblib
classifier_rbf = joblib.load('pickl/train_rbf_SVM.pkl')
prediction_rbf = classifier_rbf.predict(test_vectors)
这段代码运行良好,输出正确。我的问题是 - 每当我想进行测试时都必须阅读培训数据吗?
谢谢。
在你的情况下,是的。
因为您没有保存(酸洗)tfidfVectorizer
。
测试数据的转换方式必须与训练数据的转换方式完全相同,才能给出有意义的预测。
因此,如果您不想一次又一次地读取火车数据,请将 tfidfVectorizer
与一些估算器一起腌制,然后在测试期间将其取消挑选。
您可能还想查看 scikit-learn 中提供的 Pipeline 以将数据预处理和估计合并到一个对象中,您可以轻松地 pickle 和 unpicke 而无需担心酸洗和加载培训的各个部分
编辑 - 添加代码
第一次训练时,在最后添加这行代码:
joblib.dump(vectorizer, 'pickl/train_vectorizer.pkl',1)
现在对数据进行测试时,无需加载训练数据。只需加载已经安装的矢量化器:
classifier_rbf = joblib.load('pickl/train_rbf_SVM.pkl')
vectorizer = joblib.load('pickl/train_vectorizer.pkl')
test_vectors = vectorizer.transform(test_data)
prediction_rbf = classifier_rbf.predict(test_vectors)
我正在使用 SVM (scikit) 训练和测试数据。我正在训练 SVM 并从中准备泡菜。然后,我用那个 pickle 来测试我的系统。首先,我分别读取变量 train_data
和 test_data
中的训练数据和测试数据。
之后,我用于训练的代码是:
vectorizer = TfidfVectorizer(max_df = 0.8,
sublinear_tf=True,
use_idf=True)
train_vectors = vectorizer.fit_transform(train_data)
test_vectors = vectorizer.transform(test_data)
classifier_rbf = svm.SVC()
classifier_rbf.fit(train_vectors, train_labels)
from sklearn.externals import joblib
joblib.dump(classifier_rbf, 'pickl/train_rbf_SVM.pkl',1)
再次测试时,我正在分别读取变量 train_data
和 test_data
中的训练数据和测试数据。我用于测试的代码是:
vectorizer = TfidfVectorizer(max_df = 0.8,
sublinear_tf=True,
use_idf=True)
train_vectors = vectorizer.fit_transform(train_data)
test_vectors = vectorizer.transform(test_data)
from sklearn.externals import joblib
classifier_rbf = joblib.load('pickl/train_rbf_SVM.pkl')
prediction_rbf = classifier_rbf.predict(test_vectors)
这段代码运行良好,输出正确。我的问题是 - 每当我想进行测试时都必须阅读培训数据吗?
谢谢。
在你的情况下,是的。
因为您没有保存(酸洗)tfidfVectorizer
。
测试数据的转换方式必须与训练数据的转换方式完全相同,才能给出有意义的预测。
因此,如果您不想一次又一次地读取火车数据,请将 tfidfVectorizer
与一些估算器一起腌制,然后在测试期间将其取消挑选。
您可能还想查看 scikit-learn 中提供的 Pipeline 以将数据预处理和估计合并到一个对象中,您可以轻松地 pickle 和 unpicke 而无需担心酸洗和加载培训的各个部分
编辑 - 添加代码
第一次训练时,在最后添加这行代码:
joblib.dump(vectorizer, 'pickl/train_vectorizer.pkl',1)
现在对数据进行测试时,无需加载训练数据。只需加载已经安装的矢量化器:
classifier_rbf = joblib.load('pickl/train_rbf_SVM.pkl')
vectorizer = joblib.load('pickl/train_vectorizer.pkl')
test_vectors = vectorizer.transform(test_data)
prediction_rbf = classifier_rbf.predict(test_vectors)