这次要学习的baseline地址
关联比赛:
零基础入门NLP - 新闻文本分类,是一个对匿名字符进行文本分类的比赛
学习段落1:
train_text = train['text']test_text = test['text']all_text = pd.concat([train_text, test_text])word_vectorizer = TfidfVectorizer(sublinear_tf=True,strip_accents='unicode',analyzer='word',token_pattern=r'\w{1,}',stop_words='english',ngram_range=(1, 1),max_features=10000)word_vectorizer.fit(all_text)train_word_features = word_vectorizer.transform(train_text)test_word_features = word_vectorizer.transform(test_text)train_word_features
细节1: 关于concat
首先作者做了一个concat,他在做TfidfVectorizer时,是将所有的文本一起fit,然后再分别的transform到不同的train集和test集上,这在NLP中并不会造成leak的问题,是一种特征提取的过程。
细节2: 关于TfidfVectorizer参数
sublinear_tf=True,查看一下文档,我们发现他是做了一个变换tf = 1 + log(tf)。
sublinear_tfbool, default=FalseApply sublinear tf scaling, i.e. replace tf with 1 + log(tf)Tf is “n” (natural) by default, “l” (logarithmic) when sublinear_tf=True
我们知道 tf 的数值一般在 0-1 之间(词频),所以这个变换还是有点意思的,可以配合 max_df=0.5 之类的来使用。
analyzer='word': 这个应该是默认值,定义为char的话,会分割的更细,但是这里是匿名字符,我们还是希望以空格分割的好。
token_pattern=r'\w{1,}': 它的默认值只匹配长度≥2的单词,但是我们这里是数字啊,那么0-9不就被屏蔽了吗?,所以这里作者使用了一个正则表达式,匹配所有长度的单词
stop_words='english',ngram_range=(1, 1),max_features=10000作者选取了 unigram 和 10000 的特征。
学习段落2:xgboost段落
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)X_test = test_word_features[:,:300]
这里作者提取了300维,仔细想想,如果放10000维进去,效果应该不好,xgb也受不了。
