#读芯术#第一次参加Kaggle竞赛,该怎么做?( 二 )


现在 , 数据集如下所示 。
#读芯术#第一次参加Kaggle竞赛,该怎么做?
本文插图
文本(尤其是推文)通常会包含很多特殊字符 , 但这些字符对机器学习算法来说不一定有意义 。 因此 , 笔者要采取的第一步就是删去这些字符 。 还将把所有单词变成小写 。


  • import redef clean_text(df, text_field): df[text_field] =df[text_field].str.lower df[text_field] =df[text_field].apply(lambda elem: re.sub(r"(@[A-Za-z0-9]+)|([^0-9A-Za-z\t])|(\w+:\/\/\S+)|^rt|http.+?", "", elem)) return dfdata_clean =clean_text(train_data, "text")data_clean.head

  • #读芯术#第一次参加Kaggle竞赛,该怎么做?
    本文插图

  • 另一种有用的文本清理过程是删除停用词 。 停用词使用频率很高 , 但传达的意义一般不大 。 在英语中 , 停用词包括“the”、“it”、“as”这样的词 。 这些词如果保留在文本中 , 将会产生大量噪声 , 算法学习起来会更加困难 。

  • 自然语言工具包(NLTK)汇集了用于处理文本数据的python库和工具 , 点击此处访问完整文档 。 除了处理工具之外 , 自然语言工具包还拥有庞大的文本语料库和词汇资源 , 其中包括多种语言的全部停用词资源 。 该库将用来从数据集中删除停用词 。
    自然语言工具包库可通过pip安装 。 安装完成后 , 需要导入语料库并下载停用词文件 。

  • import nltk.corpusnltk.download('stopwords')
  • 此步骤完成后 , 你可以读入停用词 , 并使用语料库删除推文中的停用词 。

  • from nltk.corpus importstopwordsstop = stopwords.words('english')data_clean['text'] =data_clean['text'].apply(lambda x: ' '.join([word for word in x.split if wordnot in (stop)]))data_clean.head

  • #读芯术#第一次参加Kaggle竞赛,该怎么做?
    本文插图

  • 数据预处理
    数据清洗干净后 , 还需要进行进一步的预处理才能用于机器学习算法 。
    所有机器学习算法都使用数学计算映射特征中的模式(在本文的情况下是文本或单词)和目标变量 。 因此 , 为了执行计算 , 训练机器学习模型之前必须将文本转换为数字形式 。
    该类型的预处理有多种方法 , 但笔者将举例使用scikit-learn库中的两种方法 。
    该过程的第一步是将数据拆分为标记或单个单词 , 计算每个单词在文本中出现的频率 , 然后将这些计数表示为稀疏矩阵 。
    CountVectoriser函数可实现此目的 。
    下一步是对CountVectoriser产生的字数进行加权 。 采用该加权的目的是按比例减少文本中频繁出现单词的影响 , 这样 , 在模型训练过程中 , 不频繁出现或提供更多信息的单词会得到重视 。 TfidTransformer可执行此功能 。
    机器学习管道
    将所有预处理和模型拟合放入scikit-learn管道 , 看看模型的表现如何 。 第一次尝试 , 笔者使用的是线性支持向量机分类器(SGDClassifier)——公认的最佳文本分类算法之一 。
    from sklearn.model_selectionimport train_test_splitX_train, X_test, y_train, y_test =train_test_split(data_clean['text'],data_clean['target'],random_state = 0)fromsklearn.feature_extraction.text import TfidfVectorizerfrom sklearn.pipeline import Pipelinefrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfTransformerfrom sklearn.linear_model import SGDClassifierpipeline_sgd = Pipeline([ ('vect', CountVectorizer), ('tfidf', TfidfTransformer), ('nb', SGDClassifier),])model = pipeline_sgd.fit(X_train, y_train)


    推荐阅读