Kaggle比赛的ROC得分不正确?

时间:2017-12-10 22:52:27

标签: python scikit-learn classification logistic-regression kaggle

我正在研究Kaggle比赛并使用Logistic回归分类器来测试十大竞争对手的方法。

链接竞赛:https://www.kaggle.com/c/detecting-insults-in-social-commentary/leaderboard

我对分类问题还是比较新的所以我只是在没有太多修改的情况下测试了分类器。在这种情况下,我使用了scikit-learn的logreg。我清理了测试/训练数据并用它来生成ROC曲线。

我在曲线下的区域是0.89,这将使我位居第一,并且显着领先,考虑到我的实现的简单性,这对我来说似乎是不可能的。有人可以告诉我,如果我的程序做错了会给出这样的分数(例如某种程度上过度拟合或代码中的错误)?

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。 https://www.kaggle.com/c/detecting-insults-in-social-commentary/data
  2. 将test_with_solutions.csv重命名为test.csv
  3. 在代码集path中作为.csv文件的路径
  4. 对于C参数,我不太了解它,如果这是我的分数如此高的原因,请告诉我,我感谢任何寻找它的好价值的建议。感谢。

    方法:

    1. 读取.csv文件并清理文本(使用预处理程序包并手动替换某些字符)
    2. 使用Snowball stemmer并检查每个单词isalpha()
    3. 使用scikit-learn的TfidfVectorizer
    4. 对测试进行矢量化并训练数据
    5. 使用培训数据训练logreg
    6. 计算并绘制ROC曲线
    7. 编辑:

      所以我玩了C参数并将C设置为高值,例如1e5,这给了我一个较低的ROC曲线区域。也许现在主要的问题是,如果我的代码是正确的并且C是我需要调整的参数,我应该优化C以给我最高的ROC曲线区域吗?

      Edit2:我使用GridSearchSV在0.1到10的范围内测试C并且仍然获得高结果(超过10且低于0.1没有做任何事情)。

1 个答案:

答案 0 :(得分:0)

您使用的测试数据与可用测试数据不同 - 仅使用test.csv文件查找C的最佳模型和值,然后仅在impermium_verification_set.csv上进行评估。当比赛开始时,看起来只有测试可用于查找模型,然后模型被锁定并且排行榜基于验证集。您正在使用两者的全套来选择最佳模型。

如果你愿意,你可以随时在Kaggle比赛页面的讨论板上询问 - 我相信那里的人也会有所帮助。此外,包括获胜者在内的一些顶级投放者已将他们的代码发布在讨论页面上以供参与。