2017-11-13 1 views
0

バランスが取れていないため、データセットをオーバーサンプリングしようとしました。私はバイナリテキスト分類を行い、両方のクラス間で1の比率を維持したいと考えています。私は問題を解決するためにSMOTEメカニズムを試しています。SMOTEでValuErrorが発生しましたimblearn.over_sampling

私はこのチュートリアルに従っ: https://beckernick.github.io/oversampling-modeling/

しかし、私が言うエラーが発生した:ここで

ValueError: could not convert string to float

が私のコードです:私はどこ

import pandas as pd 
import numpy as np 
from sklearn.feature_extraction.text import CountVectorizer 
from sklearn.feature_extraction.text import TfidfTransformer 
from sklearn.naive_bayes import MultinomialNB 
from sklearn.pipeline import Pipeline 
from sklearn.model_selection import KFold 
from sklearn.metrics import confusion_matrix, f1_score 
from imblearn.over_sampling import SMOTE 

data = pd.read_csv("dataset.csv") 

nb_pipeline = Pipeline([ 
    ('vectorizer', CountVectorizer(ngram_range = (1, 10))), 
    ('tfidf_transformer', TfidfTransformer()), 
    ('classifier', MultinomialNB()) 
]) 

k_fold = KFold(n_splits = 10) 
nb_f1_scores = [] 
nb_conf_mat = np.array([[0, 0], [0, 0]]) 

for train_indices, test_indices in k_fold.split(data): 

    train_text = data.iloc[train_indices]['sentence'].values 
    train_y = data.iloc[train_indices]['isRelevant'].values 

    test_text = data.iloc[test_indices]['sentence'].values 
    test_y = data.iloc[test_indices]['isRelevant'].values 

    sm = SMOTE(ratio = 1.0) 
    train_text_res, train_y_res = sm.fit_sample(train_text, train_y) 

    nb_pipeline.fit(train_text, train_y) 
    predictions = nb_pipeline.predict(test_text) 

    nb_conf_mat += confusion_matrix(test_y, predictions) 
    score1 = f1_score(test_y, predictions) 
    nb_f1_scores.append(score1) 

print("F1 Score: ", sum(nb_f1_scores)/len(nb_f1_scores)) 
print("Confusion Matrix: ") 
print(nb_conf_mat) 

誰も教えてもらえますが間違って、SMOTEの2つの行なしで、私のプログラムは正常に動作します。

答えて

1

テキストデータをベクトル化した後、分類子を適用する前にオーバーサンプリングする必要があります。これは、コード内のパイプラインを分割することを意味します。コードの関連部分は次のようなものでなければなりません。

nb_pipeline = Pipeline([ 
    ('vectorizer', CountVectorizer(ngram_range = (1, 10))), 
    ('tfidf_transformer', TfidfTransformer()) 
]) 

k_fold = KFold(n_splits = 10) 
nb_f1_scores = [] 
nb_conf_mat = np.array([[0, 0], [0, 0]]) 

for train_indices, test_indices in k_fold.split(data): 

    train_text = data.iloc[train_indices]['sentence'].values 
    train_y = data.iloc[train_indices]['isRelevant'].values 

    test_text = data.iloc[test_indices]['sentence'].values 
    test_y = data.iloc[test_indices]['isRelevant'].values 

    vectorized_text = nb_pipeline.fit_transform(train_text) 

    sm = SMOTE(ratio = 1.0) 
    train_text_res, train_y_res = sm.fit_sample(vectorized_text, train_y) 

    clf = MultinomialNB() 
    clf.fit(train_text_res, train_y_res) 
    predictions = clf.predict(nb_pipeline.transform(test_text)) 
+1

typo:transfrom - > transform –

関連する問題