之前的数据都是经过了规范化处理,而且模型也大多数采用了默认的初始化配置
但是在世纪研究和工作种接触到的数据都是这样规整的吗?难道默认配置就最佳的吗?
3.1模型实用技巧
一旦我们确定使用某个模型 本书所提供的程序库就可以帮助我们从标准的训练数据种,依靠默认的配置学习到模型所需要的参数;
接下来,我们便可以利用这组得来的参数指导模型在测试数据上进行预测,进而对模型的表现进行评价
但是这套方案不能保证:
①所有用于训练的数据特征都是最好的
②学习得到的参数一定是最优的
③默认配置下的模型总是最佳的
Together 我们可以从多个角度对在前面使用过的模型进行性能提升 (预处理数据 控制参数 优化模型配置)
特征提升(特征抽取和特征筛选)
特征抽取
所谓特征抽取 就是逐条将原始数据转化维特征向量的形式 这个过程同时涉及对数据特征的量化表示
原始数据 :
1数字化的信号数据(声纹,图像)
2还有大量符号化的文本
①我们无法直接将符号化的文字本身用于计算任务 而是需要通过某些处理手段 ,预先将文本量化为特征向量
有些用符号表示的数据特征已经相对结构化,并且以字典这种数据结构进行存储。
这时我们使用DictVectorizer 对特征进行抽取和向量化
measurements=[{'city':'Dubai','temperature':33.},{'city':'London','temperature':12.},
{'city':'San Fransisco','temperature':18.}]from sklearn.feature_extraction importDictVectorizer
vec=DictVectorizer() #初始化DictVectorizer()特征抽取器
print(vec.fit_transform(measurements).toarray()) #输出转化后的特征矩阵
print(vec.get_feature_names()) #输出各个维度特征含义
#DictVectorizer()特征抽取器对类别型特征进行了one-hot处理,对数值型特征没做进一步处理
DiceVectorizer 对特征的处理方式(字典):
1类别行 使用0/1二值方式
2数字型 维持原始数值即可
②另外一些文本数据更为原始 知识一系列的字符串 我们采用词袋法对特征进行抽取和向量化
词袋法的两种计算方式
CountVectorizer
TfidVectorizer
(a.)CountVectorizer——每个词(Term)在该训练文本中出现的频率(Term Frequency);
(b.)TfidfVectorizer——除了考量某一词汇在当前文本中出现的频率(Term Frequency)外,还要关注包含这个词汇的文本条数的倒数(Inverse Document Frequency)。训练文本的条目越多,TfidfVectorizer这种特征量化的方式就更有优势,因为计算词频(Term Frequency)的目的在于找出对所在文本的含义更有贡献的重要词汇
如果一个词几乎在每篇文章中都出现,说明这个词是常用词,不会帮助模型对文本进行分类。此外,在每条文本中都出现的常用词汇成为停用词(Stop Words),停用词在文本特征抽取时需要过滤掉。
#使用CountVectorizer 并且在不去掉停用词的条件下,对文本进行量化的朴素贝叶斯分类性能预测
from sklearn.datasets import fetch_20newsgroups#20类新闻文本
from sklearn.model_selection importtrain_test_splitfrom sklearn.feature_extraction.text importCountVectorizerfrom sklearn.naive_bayes importMultinomialNBfrom sklearn.metrics importclassification_report
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)
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))
#使用TfidVectorizer 并且在不去掉停用词的条件下,对文本进行量化的朴素贝叶斯分类性能预测
from sklearn.datasets importfetch_20newsgroupsfrom sklearn.model_selection importtrain_test_splitfrom sklearn.feature_extraction.text importTfidfVectorizerfrom sklearn.naive_bayes importMultinomialNBfrom sklearn.metrics importclassification_report
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)
tfidf_vec=TfidfVectorizer() #默认形式初始化tfidf统计器(不去停用词)
X_tfidf_train=tfidf_v