特征三部曲
- 特征工程专业的技术处理数据 直接能影响机器学习 就是比较厉害一点的数据处理
- 特征抽取 数据预处理 特征降维
特征抽取
-
将任意的数据 比如文本 图片 转换成机器学习的数字特征 就是为了计算机更好的处理数据
- 字段特征提取 特征离散化
- 文本特征
- 图像的特征
-
API sklearn.feature_extraction
-
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X) X:字典或者包含字典的迭代器返回值:返回sparse矩阵
- DictVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格式
- DictVectorizer.get_feature_names() 返回类别名称
-
使用实例化类 DictVectorizer 调用fit_transform方法输入数据并转换(注意返回格式)
-
使用onehot的编码方式 使用它实例化 然后出来一堆数字了 特征当中存在类别信息我们都会做onehot的编码处理 其实就是一个变相的保存方法 毕竟都说是编码方式了 就是以数字的方式记住其他类型文件 比如二进制记住所有的文件是一个道理
from sklearn import feature_extraction
# 特种工程的API
from sklearn.feature_extraction import DictVectorizer
# # 对字典一个特征的提取
# def dict_demo():
# data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
# beishilihua = DictVectorizer(sparse=False)
# data = beishilihua.fit_transform(data)
# print(data)
# print("name:",beishilihua.get_feature_names())
#
# return None
#
# dict_demo()
def dict_demo2():
data = [{'city': '北京','temperature':100}, {'city': '上海','temperature':60}, {'city': '深圳','temperature':30}]
beishilihua = DictVectorizer(sparse=True)
data = beishilihua.fit_transform(data)
# data = beishilihua.inverse_transform(data)
# print(data2)
print(data)
print("name:",beishilihua.get_feature_names())
# print(data1.get_feature_names())
return None
dict_demo2()
- 对文本进行特征值话用的识别的API
- API
from sklearn.feature_extraction.text import CountVectorizer- sklearn.feature_extraction.text.CountVectorizer(stop_words=[]) 返回词频矩阵
- CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值:返回sparse矩阵
- CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵 返回值:转换之前数据格
- CountVectorizer.get_feature_names() 返回值:单词列表
- sklearn.feature_extraction.text.TfidfVectorizer
- 中文必须要分词的效果 在jieba上用
from sklearn.feature_extraction.text import CountVectorizer
import jieba
def cut_word(text):
"""
对中文进行分词
"我爱北京天安门"————>"我 爱 北京 天安门"
:param text:
:return: text
"""
# 用结巴对中文字符串进行分词
text = " ".join(list(jieba.cut(text)))
return text
def text_chinese_count_demo2():
"""
对中文进行特征抽取
:return: None
"""
data = ["你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]
# 将原始数据转换成分好词的形式
text_list = []
for sent in data:
text_list.append(cut_word(sent))
print(text_list)
# 1、实例化一个转换器类
# transfer = CountVectorizer(sparse=False)
transfer = CountVectorizer()
# 2、调用fit_transform
data = transfer.fit_transform(text_list)
print("文本特征抽取的结果:\n", data.toarray())
print("返回特征名字:\n", transfer.get_feature_names())
return None
text_chinese_count_demo2()
- TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
特征降维
- 特征选择的嵌入式、过滤式以及包裹氏三种方式 应用VarianceThreshold实现删除低方差特征
- 降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程 降低随机变量的个数
- 两种降维方式 特征选择 主成分分析也是种特征提取
- 特征选择实在冗余或者无关变量,都是从特征中找出主要特征
- 过滤式 filter 探究特征本身特点 特征与特征和目标值之间关联 然后筛选出一些来 不用他
- 低方差特征来过滤
- sklearn.feature_selection.VarianceThreshold(threshold = 0.0)
- 删除所有低方差特征
- Variance.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:训练集差异低于threshold的特征将被删除。默认值是保留所有非零方差特征,即删除所有样本中具有相同值的特征。
- 相关系数 比如皮尔逊相关系数 就是看相关性
- 当r>0时,表示两变量正相关,r<0时,两变量为负相关
- 当|r|=1时,表示两变量为完全相关,当r=0时,表示两变量间无相关关系
- 当0<|r|<1时,表示两变量存在一定程度的相关。且|r|越接近1,两变量间线性关系越密切;|r|越接近于0,表示两变量的线性相关越弱
- 一般可按三级划分:|r|<0.4为低度相关;0.4≤|r|<0.7为显著性相关;0.7≤|r|<1为高度线性相关
- API from scipy.stats import pearsonr
- x : (N,) array_like
- y : (N,) array_like Returns: (Pearson’s correlation coefficient, p-value)
- 嵌入式 embedded 算法自动选择特征 就算高级了 看看特征和目标值之间的关联
- 决策树 信息熵 信息增益
- 正则化:L1 L2
- 深度学习:卷积等....
- 过滤式 filter 探究特征本身特点 特征与特征和目标值之间关联 然后筛选出一些来 不用他
- 主成分分析 PCA
- 高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
- 是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息 一般都是在回归分析和聚类分析中使用
- sklearn.decomposition.PCA(n_components=None)
- 将数据分解为较低维数空间
- n_components:
- 小数:表示保留百分之多少的信息
- 整数:减少到多少特征
- PCA.fit_transform(X) X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后指定维度的array
- 特征选择实在冗余或者无关变量,都是从特征中找出主要特征
def variance_demo():
"""
删除低方差特征——特征选择
:return: None
"""
data = pd.read_csv("factor_returns.csv")
print(data)
# 1、实例化一个转换器类
transfer = VarianceThreshold(threshold=1)
# 2、调用fit_transform
data = transfer.fit_transform(data.iloc[:, 1:10]) #后面的指定数值 所有的行 (1,10]的区间的值
print("删除低方差特征的结果:\n", data)
print("形状:\n", data.shape)
return None
import pandas as pd
from scipy.stats import pearsonr
def pearsonr_demo():
"""
相关系数计算
:return: None
"""
data = pd.read_csv("factor_returns.csv")
factor = ['pe_ratio', 'pb_ratio', 'market_cap', 'return_on_asset_net_profit', 'du_return_on_equity', 'ev',
'earnings_per_share', 'revenue', 'total_expense']
for i in range(len(factor)):
for j in range(i, len(factor) - 1):
print(
"指标%s与指标%s之间的相关性大小为%f" % (factor[i], factor[j + 1], pearsonr(data[factor[i]], data[factor[j + 1]])[0]))
return None
from sklearn.decomposition import PCA
def pca():
data = [[2,8,4,5], [6,3,0,8], [5,4,9,1]]
shiliihua = PCA(n_components=0.95)
data1 = shiliihua.fit_transform(data)
print(data1)
print("----------------------")
shiliihua2 = PCA(n_components=3)
data2 = shiliihua2.fit_transform(data)
print(data2)
return None
pca()
特征预处理
- 通过一些转换函数将特征数据变成更适合模型的数据
- 归一化 标准化
- 把原始数据进行变换映射到【0,1】区间内
- API sklearn.preprocessing.MinMaxScaler ( feature_range=(0,1)… )
- MinMaxScalar.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
- 使用的是sklearn里面的 但是pandas较为简单 就是把数据规定在一个值里面了 模型好用
import pandas as pd
from sklearn.preprocessing import MinMaxScaler
def minmax_demo():
"""
归一化演示
:return: None
"""
data = pd.read_csv("dating.txt")
print(data)
# 1、实例化一个转换器类
transfer = MinMaxScaler(feature_range=(2, 3))
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("最小值最大值归一化处理的结果:\n", data)
return None
- API
sklearn.preprocessing.StandardScaler( )- 处理之后每列来说所有数据都聚集在均值0附近标准差差为1
- StandardScaler.fit_transform(X)
- X:numpy array格式的数据[n_samples,n_features]
- 返回值:转换后的形状相同的array
import pandas as pd
from sklearn.preprocessing import StandardScaler
def stand_demo():
"""
标准化演示
:return: None
"""
data = pd.read_csv("dating.txt")
print(data)
# 1、实例化一个转换器类
transfer = StandardScaler()
# 2、调用fit_transform
data = transfer.fit_transform(data[['milage','Liters','Consumtime']])
print("标准化的结果:\n", data)
print("每一列特征的平均值:\n", transfer.mean_)
print("每一列特征的方差:\n", transfer.var_)
return None
-
还有pandas里面用的数据处理 归一化和标准化归一化标准化统一的API from sklearn import preprocessing
-
标准化standardscaler
- baozhunhua = (大一点的类)preprocessing.(小一点的类)StandardScaler()
- new_data = shiliihua.fit_transform(data)
- 标准化就是针对异常点有点多的数据 对原始数据进行变换把数据变换到均值为0,标准差为1范围内异常点少量的话对于品均值影响很小的 适合现在嘈杂的数据
-
归一化minmax_scaler
- baozhunhua = (大一点的类)preprocessing.MinMaxScaler()(小一点的类)()
- new_data = shiliihua.fit_transform(data)
- 归一化直接就是给了范围了 比如[7,8] 这就是七八之间的范围 但是这样的鲁棒性很差的 最大值和最小值会变化 只适合传统的小数据