这次要学习的baseline地址

关联比赛:

零基础入门NLP - 新闻文本分类,是一个对匿名字符进行文本分类的比赛

学习段落1:

  1. train_text = train['text']
  2. test_text = test['text']
  3. all_text = pd.concat([train_text, test_text])
  4. word_vectorizer = TfidfVectorizer(
  5. sublinear_tf=True,
  6. strip_accents='unicode',
  7. analyzer='word',
  8. token_pattern=r'\w{1,}',
  9. stop_words='english',
  10. ngram_range=(1, 1),
  11. max_features=10000)
  12. word_vectorizer.fit(all_text)
  13. train_word_features = word_vectorizer.transform(train_text)
  14. test_word_features = word_vectorizer.transform(test_text)
  15. train_word_features

细节1: 关于concat

首先作者做了一个concat,他在做TfidfVectorizer时,是将所有的文本一起fit,然后再分别的transform到不同的train集和test集上,这在NLP中并不会造成leak的问题,是一种特征提取的过程。

细节2: 关于TfidfVectorizer参数

    1. sublinear_tf=True ,查看一下文档,我们发现他是做了一个变换tf = 1 + log(tf)
  1. sublinear_tfbool, default=False
  2. Apply sublinear tf scaling, i.e. replace tf with 1 + log(tf)
  3. Tf is n (natural) by default, l (logarithmic) when sublinear_tf=True

我们知道 tf 的数值一般在 0-1 之间(词频),所以这个变换还是有点意思的,可以配合 max_df=0.5 之类的来使用。

    1. analyzer='word': 这个应该是默认值,定义为 char的话,会分割的更细,但是这里是匿名字符,我们还是希望以空格分割的好。
    1. token_pattern=r'\w{1,}': 它的默认值只匹配长度≥2的单词,但是我们这里是数字啊,那么0-9不就被屏蔽了吗?,所以这里作者使用了一个正则表达式,匹配所有长度的单词
    1. stop_words='english',ngram_range=(1, 1),max_features=10000作者选取了 unigram 和 10000 的特征。

学习段落2:xgboost段落

  1. x_train_, x_valid_, y_train_, y_valid_ = train_test_split(X_train[:, :300], y_train, test_size=0.2, shuffle=True, random_state=42)
  2. X_test = test_word_features[:,:300]

这里作者提取了300维,仔细想想,如果放10000维进去,效果应该不好,xgb也受不了。