Python机器学习及实践从零开始通往Kaggle竞赛之路之第三章 实践篇

本章主要介绍的内容有:如何对数据集进行预处理,如何提取真实数据的特征、如何使用自动寻找模型中参数的最优解、

 

选择数据集中的特征分成两步:第一步特征抽取,也即是将数据集中的样本数据转化成对应的向量。第二步特征筛选,可以人为的进行特征筛选,也可使用sklearn中自带函数自动选择样本中重要的特征。本节使用朴素贝叶斯模型预测20news新闻数据集类别,其中使用CountVectorizer和TfidfVectorizer将数据集转化成向量。

 

CountVectorizer()函数,对于数据集中出现的每一个单词,CountVectorizer统计单词出现的次数,将其作为该单词对应的独热编码的对应的数据,但是其有一个缺点,对于冠词the a一类频繁出现但是没有实际意义的数据会占有更加大比例,

TfidfVectorizer()函数,不仅计算单词出现的次数,而且还计算该单词对应的出现的句子的倒数,通过单词句子出现倒数限制冠词对模型的影响。

 

实验代码如下:

# -*- coding: utf-8 -*-
# @Time    : 2019/4/8 15:00
# @Author  : YYLin
# @Email   : [email protected]
# @File    : CountVectorizer-TfidfVectorizer-MultinomialNB-20new.py
# 从sklearn.datasets里导入20类新闻文本数据抓取器。
from sklearn.datasets import fetch_20newsgroups
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import classification_report
from sklearn.feature_extraction.text import TfidfVectorizer

# 加载20newsgroups中的数据集
news = fetch_20newsgroups(subset='all')
X_train, X_test, y_train, y_test = train_test_split(news.data, news.target, test_size=0.25, random_state=33)

# 采用默认的配置对CountVectorizer进行初始化(默认配置不去除英文停用词),并且赋值给变量count_vec。
count_vec = CountVectorizer()
X_count_train = count_vec.fit_transform(X_train)
X_count_test = count_vec.transform(X_test)

# 使用贝叶斯进行数据集的预测
mnb_count = MultinomialNB()
mnb_count.fit(X_count_train, y_train)

# 输出模型准确性结果。
print('The accuracy of classifying 20newsgroups using Naive Bayes (CountVectorizer without filtering stopwords):',
          mnb_count.score(X_count_test, y_test))
y_count_predict = mnb_count.predict(X_count_test)
print(classification_report(y_test, y_count_predict, target_names = news.target_names))


# 采用默认的配置对TfidfVectorizer进行初始化(默认配置不去除英文停用词),并且赋值给变量tfidf_vec。
tfidf_vec = TfidfVectorizer()

# 使用tfidf的方式,将原始训练和测试文本转化为特征向量。
X_tfidf_train = tfidf_vec.fit_transform(X_train)
X_tfidf_test = tfidf_vec.transform(X_test)

# 依然使用默认配置的朴素贝叶斯分类器,在相同的训练和测试数据上,对新的特征量化方式进行性能评估。
mnb_tfidf = MultinomialNB()
mnb_tfidf.fit(X_tfidf_train, y_train)
print('The accuracy of classifying 20newsgroups with Naive Bayes (TfidfVectorizer without filtering stopwords):', \
       mnb_tfidf.score(X_tfidf_test, y_test))
y_tfidf_predict = mnb_tfidf.predict(X_tfidf_test)
print(classification_report(y_test, y_tfidf_predict, target_names=news.target_names))

 

实验结果:

 

第二如何自动选择数据集中的特征: 使用sklearn中自带SelectPercentile()函数选择属性,数据集的选择是泰坦尼克号上的人员信息。其中有一个cross_val_score()函数,其目的是打印按照一定比例增加特征的数量,并输出结果最好的特征对应的比例。

 

# -*- coding: utf-8 -*-
# @Time    : 2019/4/8 15:14
# @Author  : YYLin
# @Email   : [email protected]
# @File    : Feature-Selection-DecisionTreeClassifier.py
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import pandas as pd
from sklearn.feature_extraction import DictVectorizer
from sklearn import feature_selection
import numpy as np
from sklearn.model_selection import cross_val_score # 测试选择多少比例的特征时图像预测的最好


# 加载数据集并分成测试集和训练集
titanic = pd.read_csv('../Dataset/Tencent-Datasets/Titanic/train.csv')

# 分离数据特征与预测目标。# 对对缺失数据进行填充。
y = titanic['Survived']
X = titanic.drop(['Parch', 'Name', 'Survived'], axis = 1)

X['Age'].fillna(X['Age'].mean(), inplace=True)
X.fillna('UNKNOWN', inplace=True)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=33)

# 类别型特征向量化
vec = DictVectorizer()
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
X_test = vec.transform(X_test.to_dict(orient='record'))

print("------------使用决策树模型依靠所有特征进行预测,并作性能评估-----------")
dt = DecisionTreeClassifier(criterion='entropy')
dt.fit(X_train, y_train)
print(dt.score(X_test, y_test))

print("筛选前20%的特征,使用相同配置的决策树模型进行预测,并且评估性能")
fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile=20)
X_train_fs = fs.fit_transform(X_train, y_train)
dt.fit(X_train_fs, y_train)
X_test_fs = fs.transform(X_test)
print(dt.score(X_test_fs, y_test))

percentiles = range(1, 100, 5)
results = []

for i in percentiles:
    fs = feature_selection.SelectPercentile(feature_selection.chi2, percentile = i)
    X_train_fs = fs.fit_transform(X_train, y_train)
    scores = cross_val_score(dt, X_train_fs, y_train, cv=5)
    results = np.append(results, scores.mean())

# 找到提现最佳性能的特征筛选的百分比。
opt = int(np.where(results == results.max())[0])
print('Optimal number of features ', percentiles[opt])

# 画图显示预测的比例
import pylab as pl
pl.plot(percentiles, results)
pl.xlabel('percentiles of features')
pl.ylabel('accuracy')
pl.show()

 

你可能感兴趣的:(Python机器学习及实践从零开始通往Kaggle竞赛之路之第三章 实践篇)