机器学习 特征工程和文本特征提取
首先下载Scikit-learn库
下载命令 pip install Scikit-learn
通过导入import sklearn
命令查看是否可用
注意:安装Scikit-learn需要Numpy,pandas等库
对字典的特征值化
from sklearn.feature_extraction import DictVectorizer
def dictvec():
"""
对字典特征值
return None
"""
dit = DictVectorizer()#实例化
data = dit.fit_transform([{'city':'北京','temperature':100},{'city':'上海','temperature': 60},{'city':'深圳','temperature': 30}])
print(data)
return None
if __name__=="__main__":
dictvec()
对文本实例化:
from sklearn.feature_extraction.text import DictVectorizer
def wenben():
"""
对文本特征值
return None
"""
wb = DictVectorizer()#实例化
data = wb.fit_transform(['人生苦短,我用python','人生漫长,不用python'])
print(data.toarray())
return None
if __name__=="__main__":
wenben()
对中文实例化:
需要下载 jieba 这个库,对文字进行分词
代码如下:
from sklearn.feature_extraction.text import DictVectorizer
import jieba
def cutword():
cont1=jieba.cut("今天很残忍,明天更残酷")
cont2=jieba.cut("我们看到的从很远星系来的光是在几百万年之前发出的")
cont3=jieba.cut("如果重用一种方式了解某种事物,你就不会真正的了解他")
#转换成列表
content1=list(con1)
content2=list(con2)
content3=list(con3)
#把列表转换成字符串
c1=" ".join(content1)
c2=" ".join(content2)
c3=" ".join(content3)
return c1,c2,c3
def zhongwen():
"""
对中文特征值
return None
"""
c1,c2,c3=cutword()
print(c1,c2,c3)
zw = DictVectorizer()#实例化
data = zw.fit_transform([c1,c2,c3])
print(zw.get_feature_names())
print(data.toarray())
return None
if __name__=="__main__":
zhongwen()
tf-idf分析:
Tf:term frequency :词的频率 出现的次数
idf:逆文档频率 inverse document frequency log(总文档数量/该词出现的文档数量)
数据的特征预处理:
特征处理是通过特定的统计方法(数学方法)将数据转换成算法要求的数据
数据处理分类
数值型数据:标准缩放:1、归一化 2、标准化 3、缺失值
类别型数据:one-hot编码
时间类型:时间的切分
归一化:
特点:通过对原始数据进行变换把数据映射到(默认为[0,1])之间
from sklearn.preprocessing import MinMaxScaler
def mm():
"""
归一化处理
return None
"""
mm=MinMaxScaler(feature_range=(2,3))
data=mm.fit_transfrom([[90,2,10,40],[60,2,15,45],[75,3,13,46]])
print(data)
return None
if __name__=="__main__":
mm()
公式:x’=(x-min)/(max-min) x’’=x’*(mx-mi)+mi
注释:作用于每一列,max为一列得到最大值,min为一列的最小值,那么x’'为最终结果,mx,mi分别指定区间默认mx=1,mi=0
三个或多个特征同等重要的时候:进行归一化
目的:是对某一个特征对最终结果不会造成更大的影响
提问:
如果数据中异常点较多,会有什么影响?
答:异常点对最大值最小值影响太大,对最后的值影响大,归一化的鲁棒性较差,只适合传统经过却小数据场景。
标准化:
特点:通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
公式:
x’=(x-mean)/标准差
注释:作用于每一列,mean为平均值,var为方差,var=(x1-mean)²+(x2-mean)²+……/n(每个特征的样本数)
标准差=var开平方。
其中:方差(考量数据的稳定性)方差越大,数据越分散,方差越小,数据越聚集。
对于标准化来讲,异常点不会对标准化有太大的影响,因为具有一定的数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
方差为0时,这个特征所有值都一样。
sklearn特征化API:scikit-learn.preprocessing.StandardScaler
StandarScaler()处理之后每列来说所有的数据都聚集在均值为0附近标准差为1
StandarScaler.mean_ 查看原始数据中每列特征的平均值
StandarScaler.std_ 查看原始数据每列特征的方差
标准化步骤:
from sklearn.preprocessing import StandardScaler
def bz():
"""
标准化缩放
return None
"""
bz=StandardScaler()
data=StandardScaler.fit_transform([[2.,-1.,3.],[2.,4.,2.],[4.,6.,-2.]])
print(data)
return None
if __name__=="__main__":
bz()
标准化总结:
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
缺失值:
如何处理数据中的缺失值:
删除:如果某行或某列数据缺失值达到一定的比列,建议放弃整行或整列(一般不建议用此方法)
插补:可以通过缺失值每行或每列的平均值、中位数来填充
sklearn缺失值API:sklearn.preprocessing.Imputer
数据中的缺失值:np.nan
如果不是则用replace("?",np.nan)进行转换
缺失值步骤:
from sklearn.preprocessing import Imputer
import numpy as np
def im():
"""
缺失值处理
return None
"""
im=Imputer(missing_values='Nan',strategy='mean,axis=0')
data=im.fit_transfrom([[1,2],[np.nan,3],[7,6]])
print(data)
return None
if __name__=="__main__":
im()
注意:需要导入numpy库,numpy的数组中可以使用np.nan/np.NaN来代替缺失值,属于float类型,
如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数据即可。