私は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)
指示:
- Kaggleリンクからtrain.csvとtest_with_solutions.csvをダウンロードしてください。コードで
- をのtest.CSVする https://www.kaggle.com/c/detecting-insults-in-social-commentary/data
- 名前の変更test_with_solutions.csvは、私はあまりそれを理解し、それがある場合はありません
C
パラメータのための.csvファイル
へのパスにpath
を設定しました私の得点が高い理由は、私に教えてくださいと私はそれのために良い値を見つけるのアドバイスを感謝します。ありがとう。
アプローチ:
- を読むには、ファイルを.csvファイルとテキストをきれいに(使用プリプロセッサパッケージおよび手動で特定の文字を置き換え)
- 使用し雪玉ステマーと(各ワードはisalphaを確認してください)
- ベクタライズテストトレーニングデータとのscikit-学ぶTfidfVectorizer
- 列車のlogreg
- 計算してプロットROC曲線 を使用して列データ
編集:
だから私は、Cのパラメータで遊んや、1E5と高い値にCを設定すると、私の下のROC曲線の面積を与えます。おそらく今の主な質問は、自分のコードが正しいと仮定して最高のROCカーブ領域を与えるためにCを最適化する必要があり、Cは調整する必要があるパラメータですか?
Edit2:私はGridSearchSVを使って0.1から10の範囲でCをテストしましたが、まだ高い結果が得られました(過去10回、0.1回以下)。
ありがとうございました。私はimperium_verification_set.csvを使い、0.78のROCを得ました。だから、test_with_solutions.csvにはtest.csvとimperium_verification_set.csvの両方がありましたか?また、あなたはテストがモデルを見つけるために使用されていたと言いました...あなたは列車を意味しましたか? – Mike
はい私はそれが両方のセットを含んでいると信じています。モデルをチューニングするときには、トレーニングセットとのクロスバリデーションを行うことができます。多くのモデルを訓練していれば、テストセットスコアが最も高いモデルを選ぶことができます。 –