DictVectorizer 字典特征提取
稀疏矩阵是指一个矩阵中大部分元素为零,只有少数元素是非零的矩阵。
表示除了列出的有值, 其余全是0
提取为稀疏矩阵对应的数组
from sklearn.feature_extraction import DictVectorizer#创建转换器对象
data = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33,
'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]
#创建DictVectorizer对象
transfer = DictVectorizer(sparse=False)
data_new = transfer.fit_transform(data)
# data_new的类型为ndarray 将字典列表转化为特征矩阵
#特征数据
print("data_new:\n", data_new)
#特征名字
print("特征名字:\n", transfer.get_feature_names_out())
import pandas
pandas.DataFrame(data_new, columns=transfer.get_feature_names_out())
运行结果:
提取为稀疏矩阵
from sklearn.feature_extraction import DictVectorizer
data = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33,
'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]
transfer=DictVectorizer(sparse=True)
data_new=transfer.fit_transform(data)
print("data_new:\n", data_new)
print("特征名字:\n", transfer.get_feature_names_out())
CountVectorizer 文本特征提取
API
英文文本提取
from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd
data=["csdn is good,csdn is well","i like csdn"]
transfer=CountVectorizer(stop_words=["is","i"]) #is i不提取
data_new=transfer.fit_transform(data)
print(data_new)
import pandas
pandas.DataFrame(data_new.toarray(),index=["第一句","第二句"],columns=transfer.get_feature_names_out())
中文文本提取
import jieba
data = "在如今的互联网世界,正能量正成为澎湃时代的大流量"
data = jieba.cut(data)
data = list(data)
print(data) #['在', '如今', '的', '互联网', '世界', ',', '正', '能量', '正', '成为',
'澎湃', '时代', '的', '大', '流量']
data = " ".join(data)
print(data) #"在 如今 的 互联网 世界 , 正 能量 正 成为 澎湃 时代 的 大 流量"
TfidfVectorizer TF-IDF文本特征词的重要程度特征提取
API
无量纲化-预处理
无量纲化,也称为数据的标准化、规范化,是指不同指标之间由于量纲不同导致的不具有可比性,所以需要先进行无量纲化处理。
MinMaxScaler 归一化
让数据压缩在[0,1]范围内,适用于进行多指标综合评价的时候,不涉及距离度量、协方差计算、数据不符合正态分布的时候。
API
示例
from sklearn.preprocessing import MinMaxScaler
#原始数据为list
data1=[[1,2,3,4,5,6,7,8,9]]
data2=[[1,2,3],[4,5,6],[7,8,9]]
transfer=MinMaxScaler(feature_range=(0,1))
data1_new=transfer.fit_transform(data1)
data2_new=transfer.fit_transform(data2)
print(data1_new)
print(data2_new)
print("------------------")
#原始数据类型为DataFrame
import pandas as pd
data=pd.DataFrame(data=data2,index=["one","two","three"],columns=["第一列","第二列","第三列"])
transfer=MinMaxScaler(feature_range=(0,1))
data_new=transfer.fit_transform(data)
print(data_new)
print("------------------")
#原始数据为ndarray
from sklearn.feature_extraction import DictVectorizer
data3 = [{'city':'成都', 'age':30, 'temperature':200}, {'city':'重庆','age':33,
'temperature':60}, {'city':'北京', 'age':42, 'temperature':80}]
transfer=DictVectorizer(sparse=False)
data3_new=transfer.fit_transform(data3)
print(data3_new)
transfer=MinMaxScaler(feature_range=(0,1))
data4_new=transfer.fit_transform(data3_new)
print(data4_new)
StandardScaler 标准化
让数据的平均值为0,标准差为1,适用于聚类、因子分析的时候。
x'是转换后的数值,x是原始数据的值,μ是该特征的均值,σ是该特征的标准差
API
特征降维
1.特征选择
特征选择
是特征工程
里的一个重要问题,其目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征,从而达到减少特征个数,提高模型精确度,减少运行时间的目的
之所以要考虑特征选择,是因为机器学习经常面临过拟合的问题。过拟合的表现是模型参数太贴合训练集数据,模型在训练集上效果很好而在测试集上表现不好,也就是在高方差。简言之模型的泛化能力差。过拟合的原因是模型对于训练集数据来说太复杂,要解决过拟合问题,一般考虑如下方法:
-
通过正则化引入对复杂度的惩罚
-
对数据降维
VarianceThreshold 低方差过滤特征选择
from sklearn.feature_selection import VarianceThreshold
X = [[0,0,1],[0,1,0],[1,0,0],[0,1,1],[0,1,0],[0,1,1]]
# 返回值为特征选择后的数据
# 参数threshold为方差的阈值
data=VarianceThreshold(threshold=(.8*(1-.8)))
print(data.fit_transform(X))
根据相关系数的特征选择
Pearson相关系数
皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,衡量的是变量之间的线性相关性,结果的取值区间为[-1,1] , -1 表示完全的负相关(这个变量下降,那个就会上升), +1 表示完全的正相关, 0 表示没有线性相关性。Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的pearsonr方法能够同时计算相关系数和p-value
缺点:
作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近 0 。
import numpy as np
from scipy.stats import pearsonr
np.random.seed(0)
size=100
x=np.random.normal(0,1,size)
print("lower:\n",pearsonr(x,x+np.random.normal(0,1,size)))
print("higher:\n",pearsonr(x,x+np.random.normal(0,5,size)))
2.PCA 主成分分析降维
是一种线性无监督的降维方法。
主要思想:是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。
PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。
通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
API
#当n_components为小数,整数时
from sklearn.decomposition import PCA
def pca_demo():
data=[[2,3,4,5],[3,4,5,6],[6,7,8,9]]
transfer1=PCA(n_components=0.95)
transfer2=PCA(n_components=2)
data1_new=transfer1.fit_transform(data)
data2_new=transfer2.fit_transform(data)
print(data1_new)
print(data2_new)
return None
pca_demo()