特征工程
更好的特征意味着更好的结果
更好的特征意味着更简单的模型
更好的特征意味这更强的鲁棒性
特征预处理
单个特征:
归一化、标准化、缺失值处理
多个特征:
降维:PCA降维
分类特征变量的提取
字典特征提取
from sklearn.feature_extraction import DictVectorizer
#字典特征提取
data = [
{'yun':'厚','shidu':50},
{'yun': '厚', 'shidu': 40},
{'yun': '薄', 'shidu': 60},
{'yun':'中等', 'shidu': 50},
]
#创建一个实例对象,将来使用实例进行字典特征的提取
#如果DictVectorizer(),没有进行任何设置使用默认值,转换出来的结果是一个稀疏矩阵,如果设置sparse=False代表直接转成数组
dv = DictVectorizer()
ret = dv.fit_transform(data)
#先打印特征的name
print(dv.get_feature_names())
#稀疏矩阵可以使用toarray的方式转化成数组
print(ret.toarray())
#print(dv.inverse_transform(ret))#转化成原始数据
结果如下:
文本特征提取
from sklearn.feature_extraction.text import CountVectorizer,TfidfVectorizer
#文本特征提取(整篇文章)
context = ["life is short,i like python","life is too long,i dislike python" ,"yes,i like python" ]
#统计词是否出现,返回矩阵
cv = CountVectorizer()
data = cv.fit_transform(context)
print(cv.get_feature_names())
print(data.toarray())
#词出现的概率
tfv = TfidfVectorizer()
data = tfv.fit_transform(context)
print(tfv.get_feature_names())
print(data.toarray())
注意点:
1、stop_words表示的是停用词(写在创建对象的时候),english表示使用英文停用词,如果需要自己指定,我们可以使用列表的方式写入
2、一般情况下,我们直接使用sparse矩阵,因为语料库非常庞大,
3、fit_transform填写可迭代对象
中文分词
jieba,SnowNLP,NLPIR
数据的特征预处理
中文分词
jieba,SnowNLP,NLPIR
词形归一化处理
一、词形归一化处理
from nltk.stem.porter import PorterStemmer
ps = PorterStemmer()
print(ps.stem('like'))
print(ps.stem('dislike'))
二、归一化处理
在特征(维度)较多的时候,可以预防某一维或者几维对于数据的影响过大。例如身高170,体重50kg,所以将不同来源的数据归类到同一个参考区间下
(1)对于比较常见的方法,是使用线性转换将数据映射到[0,1]之间的区间,变换的函数是
min:代表的是整个数据中的最小值
max:代表的是整个数据中的最大值
min和max的值,容易收到异常点的影响,并且在数据流的情况下,最大值和最小值是不断变化的
适用情况:适用于精确的小数据场景下
def minmax(data_old):
print('########原始数据#########')
print(data_old)
minmax = MinMaxScaler()
data = minmax.fit_transform(data_old)
print('######转换之后的数据######')
print(data)
三、标准化处理
经过处理之后,数据的均值为0,标准差1,处理函数:
适用于比较稳定,嘈杂的数据场景
μ代表的是样本的平均值
σ 代表样本的标准差
将数据处理成符合正态分布的数据
def standar(dataset):
ss = StandardScaler()
data_new = ss.fit_transform(dataset)
return data_new
三、 异常缺失值处理
def handler_nan():
data = [[1,3],[np.nan,7],[9,11]]
im = Imputer()
data_new = im.fit_transform(data)
print(data_new)
注意点:
1、空值填充三种:均值,中位数,众数
2、axis=0代表的是列,axis=1 代表行
四、降维
主成分分析:PCA
PCA致力解决的问题:
第一,降维可以缓解维度灾难问题。
第二,降维可以在压缩数据的同时让信息损失最小化。
第三,理解几百个维度的数据结构很困难,两三个维度的数据通过可视化更容易理解。
数据的降维,必然带来数据的损失
在降维之前保证每一个维度的重要性是等同的
def __init__(self, n_components=None, copy=True, whiten=False,
svd_solver='auto', tol=0.0, iterated_power='auto',
random_state=None):
n_components:指定的是降维之后存在的特征的维度
whiten:白化,对降维之后的每一个特征进行归一化处理
def pca():
data = [[1,2,3,4],[3,4,5,6],[6,7,8,1]]
print('降维之前')
print(data)
pa = PCA(n_components=2)
data_new = pa.fit_transform(data)
print('#降维之后')
print(data_new)
注意点:
1、如果没有指定降维的个数的化,在原始的基础上,降下一维
2、降维不是指的数组的维度个数,而是说明的特征值的个数
特征选择
原因:
1、冗余:特征的相关度很高,容易消耗计算性能
2、噪声:部分特征对于最终的预测结果有负影响
特征选择方法:
1、filter过滤式VarianceThreshold(删除低方差数据)
2、emdedded 嵌入式:正则化、决策树
3、wrapper 包裹式
特征选择的功能:
减少特征的数量,降维,减少过拟合
def vtd():
data = [[1, 0, 3, 4], [3, 4, 5, 0], [6, 7, 0, 1]]
print(data)
vt = VarianceThreshold(1)
ret = vt.fit_transform(data)
print(ret)