机器学习之特征工程

sklean

datasets.load_*() 加载小数据集datasets.load_iris(), datasets.load_boston()

datasets.fetch_*(data_home=None, sunset=‘train’ ) 加载大数据集datasets.fetch_newgroups()

from sklearn.datasets import load_iris
def datasets_demo():
    '''鸢尾花数据集演示'''
    # 获取数据集
    iris = load_iris()
    # 输出结果
    print(iris)
    print('返回特征值:\n:', iris['data'])
    print('鸢尾花的目标值:\n', iris.target)
    print('返回特征值的名称:\n', iris.feature_names)
    print('返回目标值的名称:\n', iris.target_names)
    print('鸢尾花的描述:\n', iris.DESCR)
    return None
datasets_demo()

特征提取

什么是特征提取

  • 将文本转换成数值变量
  • 设置哑变量,将类型变量转换成0-1格式
1.将任意数据转换成为可用于机器学习的数字特征
2.特征提取api--->sklearn.feature_extraction

特征提取的步骤

  • 实例化一个转化器
    Transfer = DictVectorizer()

  • 对数据进行转换

    data = transfer.fit_transform(data)

  • 展示我们特征的名称

    transfer.get_feature_names()

  • 对的得到的结果进行处理

    data.toarray() 得到的是一个二维数组

字典特征提取

sklearn.feature_extraction.DictVectorizer(sparse=True)

sparse矩阵好处:降低内存,提高效率

from sklearn.feature_extraction import DictVectorizer
def dict_demo():
	'''字典特征演示'''
    #获取数据
    data = [{'city': '北京','temperature':100},{'city': '上海','temperature':60},{'city': '深圳','temperature':30}]
    # 实例化一个转换器,得到的结果不要sparse矩阵
    transfer = DictVectorizer(sparse=False)
    # 对数据进行转换
    data = transfer.fit_transform(data)
    # 输出结果
    print('返回特征的名称:\n', transfer.get_feature_names())
	print("返回字典特征提取结果:\n", data)
    return None

文本特征提取

sklearn.feature_extraction.text.CountVectorizer(stop_words=[])

CountVectorizer() 忽略了单个单词和符号作为特征值的可能。
stop_words=['is'] 限制某些单词作为特征值。
data.toarray() 可以使sprase矩阵,转换为二维数组的形式。

from sklearn.feature_extraction.text import CountVectorizer
def text_demo():
	'''英文文本特征提取'''
    # 获取数据
    data = ['life is short, i like python', 'life is too long , i dislike python']
    transfer = CountVectorizer(stop_words=['is'])
    # 传入数据,进行转换
    data = transfer.fit_transform(data)
    print('返回特征名称:\n', transfer.get_feature_names())
    print('返回文本特征提取结果:\n', data.toarray())
    return None

from sklearn.feature_extraction.text import CountVectorizer
def text_demo():
	'''中文文本特征提取'''
    # 获取数据
    data = ['人生苦短,我喜欢python','生活太长久,我不喜欢python']
    transfer = CountVectorizer(stop_words=['is'])
    # 传入数据,进行转换
    data = transfer.fit_transform(data)
    print('返回特征名称:\n', transfer.get_feature_names())
    print('返回文本特征提取结果:\n', data.toarray())
    return None

中文文本先分词,在特征提取

# 中文文本分词,特征提取
import jieba
from sklear.feature_extraction.text import CountVectorizer
def cut_word(text):
    '''我爱北京天安门'''
    '''我 爱 北京 天安门'''
    test = ' '.join(list(jieba.cut(text)))
    return text
def chinese_text_demo2():
    '''中文文本特征提取'''
    # 获取数据
    text = ['今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。','我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。','如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    text_list = []
    for sent in text:
        text_list.append(cut_word(sent)
    print(text_list)       
    # 实例化一个转换器
    transfer = CountVectorizer()                
    # 传入数据进行转换
    data = transfer.fit_transform(text_list)
    print('特征值名称:\n', transfer.get_feature_names())
    print('中文文本特征值提取结果:\n', data.toarray())                    
    return None
    

Tf-idf文本特征提取

  • TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
  • TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

5.1 公式

  • 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率

  • 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

# 中文文本分词,特征提取TF-IDF
import jieba
from sklear.feature_extraction.text import TfidfVectorizer
def cut_word(text):
    '''我爱北京天安门'''
    '''我 爱 北京 天安门'''
    test = ' '.join(list(jieba.cut(text)))
    return text
def chinese_text_demoe():
    '''中文文本特征提取'''
    # 获取数据
    text = ['今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。','我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。','如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。']
    text_list = []
    for sent in text:
        text_list.append(cut_word(sent)
    print(text_list)       
    # 实例化一个转换器
    transfer = TfidfVectorizer()                
    # 传入数据进行转换
    data = transfer.fit_transform(text_list)
    print('特征值名称:\n', transfer.get_feature_names())
    print('中文文本特征值提取结果:\n', data.toarray())                    
    return None
    

什么是特征预处理

  • **通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程 **
  • 方法:**归一化,标准化 **
  • 特征预处理API:sklearn.preprocessing

为什么要进行归一化标准化

  • 特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级容易影响(支配)目标结果,使得一些算法无法学习到其它的特征

归一化

  • 通过对原始数据进行变换把数据映射到(0,1)之间

3 API

  • sklearn.preprocessing.MinMaxScaler (feature_range=(0,1)… )
    • MinMaxScalar.fit_transform(X)
      • X:numpy array格式的数据[n_samples,n_features]
    • 返回值:转换后的形状相同的array
# 归一化演示
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
def minmax_demo():
    '''归一化的演示'''
    # 获取数据,约会数据
    data = pd.read_csv('dating.txt')
    print(data)
    # 实例化一个转换器, feature_range=(2,3)是归一化我们的区间
	transfer = MinMaxScaler(feature_range=(2, 3))
    # 进行数据转换,因为是特征提取,选前三列
	data = transfer.fit_transform(data[data.columns[:3]])
    print('归一化结果:\n', data)
    return None

归一化使用场景

  • 适合传统的精确小数据场景,收极值影响,稳健性差

标准化

1 定义

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内

作用于每一列,mean为平均值,σ为标准差

所以回到刚才异常点的地方,我们再来看看标准化

  • 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
  • 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小
# 标准化演示
from sklearn.preprocessing import StandardScaler
import pandas as pd
def stand_demo():
    '''归一化的演示'''
    # 获取数据,约会数据
    data = pd.read_csv('dating.txt')
    print(data)
    # 实例化一个转换器
    transfer = StandardScaler()
    # 进行数据转换,因为是特征提取,选前三列
	data = transfer.fit_transform(data[data.columns[:3]])
    print('归一化结果:\n', data)
    print('标准化后每列均值:\n', transfer.mean_)
    print('标准化后每列方差:\n', transfer.var_)
    return None

标准化适合场景

​ 适合现代嘈杂大数据场景。

特征的降维

降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程

  • 降维的两种方式

    1. 特征选择
    2. 主成分分析

1、特征选择

定义:数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征

方法Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联

方差选择法:低方差特征过滤

相关系数

低方差特征过滤

# 删除低方差特征值演示
threshold=3,是方差低于3的都被删除掉


from sklearn.feature_selection import VarianceThreshold
import pandas as pd
def variance_demo():
    '''删除低方差特征值'''
    data = pd.read_csv('factor_returns.csv')
    print(data)
    print(data[data.columns[1-2]].shape)
    # 实例化一个转换器
    transfer=VarianceThreshold(threshold=3)
    # 传入数据,进行转换
    data = transfer.fit_transform(data[data.columns[1-2]])
    print('返回删除低方差特征结果:\n',data)
    print('形状:\n', data.shape)
    return None

相关系数

  • 反映变量之间相关关系密切程度的统计指标
  • 相关系数的值介于–1与+1之间,即–1≤ r ≤+1。其性质如下:
    • 当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为高度线性相关
# 相关性系数
from scipy.stats import pearsonr
from pandas as pd
def pearsonr_demo():
    '''皮尔逊相关系数计算'''
    data = pd.read_csv('factor_returns.csv')
    factor = data.columns[1:-2]
    for i in range(len(factor)):
        for j in range(i, len(factor) - 1):
            print('第%s个指标与第%s个指标之间的相关系数为%s'%(factor[i], factor[j+1], pearsonr(data[factor[i]], data[factor[j + 1]])[0
            
    return None
import pandas as pd
data = pd.read_csv('factor_returns.csv')

主成分分析(PCA)

什么是主成分分析

  • 定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
  • 作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
  • 应用:回归分析或者聚类分析当中

API

sklearn.decomposition.PCA(n_components=None)
# 保留3个特征值PCA演示
from sklearn.decomposition import PCA
def pca_demo():
    '''PCA演示'''
    data = [[2,8,4,5],[6,3,0,8],[5,4,9,1]]
    # 实例化一个转换器
    transfer = PCA(n_components=3)
    # 传入数据进行转换
    data = transfer.fit_transform(data)
    print('保留3个特征值的	PCA结果', data)
    return None

案例:探究用户对物品类别的喜好细分降维

import pandas as pd
products = pd.read_csv("./instacart/products.csv")[0:20000]
order_products = pd.read_csv("./instacart/order_products__prior.csv")[0:20000]
orders = pd.read_csv("./instacart/orders.csv")[0:20000]
aisles = pd.read_csv("./instacart/aisles.csv")[0:20000]
# 合并数据
tab1 = pd.merge(aisles,products,on='aisle_id')
tab2 = pd.merge(tab1,order_products,on='product_id')
tab3 = pd.merge(tab2,orders,on='order_id')
table = pd.crosstab(tab3['user_id'], tab3['aisle'])
table

你可能感兴趣的:(机器学习)