1

私はKaggleの競技を研究しており、Logistic Regression分類器を使用して上位10人の競技者のアプローチをテストしました。競争にKaggle競争のROCスコアが間違っていますか?

リンク:https://www.kaggle.com/c/detecting-insults-in-social-commentary/leaderboard

私はまだ私はあまりにも多くの変更を加えることなく分類をテストした分類問題にかなり新しいです。この場合、scikit-learnのlogregを使用しました。私はテスト/列車のデータを消去し、それを使ってROC曲線を生成しました。

カーブの下の領域は0.89で、これは私を第1位にして有意義な位置に置いてくれました。これは私の実装の単純さを考慮すると非常に不可能です。誰かが私のプログラムが間違ってこのようなスコアを与える何かをしているかどうか私に教えてもらえますか(例:オーバーフィッティングやコードの不具合)?

import csv 
import preprocessor as p 
import matplotlib.pyplot as plt 
from sklearn import linear_model 
from sklearn.feature_extraction.text import TfidfVectorizer 
from nltk.stem.snowball import SnowballStemmer 
from nltk.tokenize import word_tokenize 
from sklearn.metrics import roc_curve 
from sklearn.metrics import auc 

path = "C:\\Users\\Mike\\Desktop" 

def vectorize_dataset(subpath, stem, vectorizer): 
    comments = [] 
    labels = [] 
    stemmer = SnowballStemmer("english") 
    with open(path + subpath + '.csv', 'r') as f: 
     data_csv = csv.reader(f) 

     for row in data_csv: 
      clean_txt = p.clean(row[2]) 
      clean_txt = clean_txt.strip().replace('"', '').replace('\\\\', '\\').replace('_', ' ') 
      clean_txt = bytes(clean_txt, 'utf-8').decode('unicode_escape', 'ignore') 
      if stem: 
       clean_txt = [stemmer.stem(word.lower()) for word in word_tokenize(clean_txt)] 
      clean_txt = [word for word in clean_txt if word.isalpha()]  
      clean_txt = " ".join(clean_txt) 

      if clean_txt != "": 
       if row[0] == str(1) or row[0] == str(0): 
        comments.append(clean_txt) 
        labels.append(int(row[0])) 
    if subpath == "\\train": 
     return (vectorizer.fit_transform(comments), labels) 
    return (vectorizer.transform(comments), labels) 

def print_auroc_for_classifier(vect_tuple, classifier): 
    y_true, y_score = [], [] 

    for sample, label in zip(vect_tuple[0], vect_tuple[1]): 
     y_true.append(label) 
     y_score.append(classifier.predict_proba(sample)[0][1]) 

    fpr, tpr, thresholds = roc_curve(y_true, y_score) 
    roc_auc = auc(fpr, tpr) 
    print("ROC AUC: %.2f" % roc_auc) 

    plt.plot(fpr, tpr) 

if __name__ == '__main__':  
    plt.figure() 
    plt.xlim([0.0, 1.0]) 
    plt.ylim([0.0, 1.05]) 
    plt.xlabel('False Positive Rate') 
    plt.ylabel('True Positive Rate') 
    plt.title('Receiver operating characteristic example') 
    plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--') 

    vectorizer = TfidfVectorizer() 
    train_tuple = vectorize_dataset('\\train', True, vectorizer) 
    test_tuple = vectorize_dataset('\\test', True, vectorizer) 

    logreg = linear_model.LogisticRegression(C=7) 
    logreg.fit(train_tuple[0].toarray(), train_tuple[1]) 

    print_auroc_for_classifier(test_tuple, logreg) 

指示:

  1. Kaggleリンクからtrain.csvとtest_with_solutions.csvをダウンロードしてください。コードで
  2. をのtest.CSVする https://www.kaggle.com/c/detecting-insults-in-social-commentary/data
  3. 名前の変更test_with_solutions.csvは、私はあまりそれを理解し、それがある場合はありませんCパラメータのための.csvファイル

へのパスにpathを設定しました私の得点が高い理由は、私に教えてくださいと私はそれのために良い値を見つけるのアドバイスを感謝します。ありがとう。

アプローチ:

  1. を読むには、ファイルを.csvファイルとテキストをきれいに(使用プリプロセッサパッケージおよび手動で特定の文字を置き換え)
  2. 使用し雪玉ステマーと(各ワードはisalphaを確認してください)
  3. ベクタライズテストトレーニングデータとのscikit-学ぶTfidfVectorizer
  4. 列車のlogreg
  5. 計算してプロットROC曲線
  6. を使用して列データ

編集:

だから私は、Cのパラメータで遊んや、1E5と高い値にCを設定すると、私の下のROC曲線の面積を与えます。おそらく今の主な質問は、自分のコードが正しいと仮定して最高のROCカーブ領域を与えるためにCを最適化する必要があり、Cは調整する必要があるパラメータですか?

Edit2:私はGridSearchSVを使って0.1から10の範囲でCをテストしましたが、まだ高い結果が得られました(過去10回、0.1回以下)。

答えて

0

異なるテストデータを使用していますが、test.csvファイルだけを使用してCの最適なモデルと値を見つけ、impermium_verification_set.csvで評価してください。競争が実行されているときには、モデルを見つけるためのテストしか利用できなかったように見え、モデルはロックされ、リーダーボードは検証セットに基づいていました。あなたは両方の完全なセットを使用して、最良のモデルを選択しています。

あなたはいつでも、Kaggleの競技ページのディスカッション掲示板で頼むことができます - 私はそこにいる人々も助けてくれると確信しています。また、優勝者を含むトップ選手の一部が、興味のあるディスカッションページにコードを掲載しました。

+0

ありがとうございました。私はimperium_verification_set.csvを使い、0.78のROCを得ました。だから、test_with_solutions.csvにはtest.csvとimperium_verification_set.csvの両方がありましたか?また、あなたはテストがモデルを見つけるために使用されていたと言いました...あなたは列車を意味しましたか? – Mike

+0

はい私はそれが両方のセットを含んでいると信じています。モデルをチューニングするときには、トレーニングセットとのクロスバリデーションを行うことができます。多くのモデルを訓練していれば、テストセットスコアが最も高いモデルを選ぶことができます。 –

関連する問題