2

私はここで sk-learn と機械学習に比較的慣れていないので、無知の可能性があることを許してください。テキストの説明 (Python) に基づいてアセットを分類するモデルを作成しています。予測子 (テキスト) と予測 (カテゴリ) 変数は 1 つだけです。ラベルについては、カテゴリを因数分解しています。約 30 あるため、それぞれが 0 から 29 までの数値で表されます。機能については、tf-idf スコアを使用しています。モデリングと精度は良好で、ピクル ダンプを使用してモデルを保存しています。

ただし、モデルは再利用可能である必要があるため、新しいデータ セットにラベルを付けるために、ある時点で再度ロードできる必要があります。以下のモデルの保存/読み込みのコードを参照してください。

## Save the linear SVC model
filename = 'SVM_model.sav'
pickle.dump(model, open(filename, 'wb'))

## Load model and test prediction accuracy
tfidf = TfidfVectorizer(analyzer='word',sublinear_tf=True, min_df=3, 
norm='l2', ngram_range=(1, 2), encoding='latin-1', stop_words='english')
testdf=pd.read_excel('learning_df.xlsx').tail(54068)
testdf['input']=testdf['item_description'].astype(str)+'- 
'+testdf['category_name_client'].astype(str)
testdf=testdf[['input','category_id_D&P']].dropna()
testdf['factor']=testdf['category_id_D&P'].apply(lambda x: cat_dict[x])
loaded_model = pickle.load(open(filename, 'rb'))
X_test1=tfidf.fit_transform(testdf.input).toarray()
y_test1=testdf['factor']
result = loaded_model.score(X_test1, y_test1)
print(result)

tfidf ベクトライザーの設定は、モデルのトレーニング/検証が行われたものとまったく同じであることに注意してください。cat_dict はカテゴリの最初の因数分解です。ここでは、テキスト カテゴリが、モデルがトレーニング/検証されたものと同じ数値に変換されるようにしています。

これを試みたところ、次のエラーが発生しました。

ValueError: X has 24008 features per sample; expecting 20012

新しいデータセットの tf-idf は、最初に使用されたトレーニング/検証データセットと同じ数の機能を生成しないため、これは理解できます。

それで、これに対する回避策があるかどうか疑問に思っていましたか?モデルをトレーニングするとき、そもそも tf-idf を使用すべきではありませんか? そうでない場合、後でこの問題を引き起こさない機能選択の代替方法は何ですか?

事前に感謝し、明らかな何かが欠けている場合は申し訳ありません。

4

1 に答える 1