机器学习——scikit-learn特征工程

一、安装环境与导入切分数据

1.安装环境

基本概念
下载pycharm 新建项目在虚拟环境解释器里面添加scikit-learn包,如果安装了就可以直接使用,如果没有装左下角的加号点进去搜索scikitlearn即可,基本的python,pip安装参考菜鸟
在这里插入图片描述

2.导入数据集

datasets是sklearn的数据集,数据集里面的具体类容参考链接
导入鸢尾花数据集,这个数据集中有150个花,包含4个特征,要分为三个种类
小型的数据集通过load导入,如下导入鸢尾花数据集

from sklearn.datasets import load_iris

获取数据集的数据,存入变量中,load的返回值类型是字典类型,打印出来如下如所示

# 获取数据集
    iris =load_iris()
    print("花数据集:\n", iris)

在这里插入图片描述
在这里插入图片描述
根据打印出来的数据,可以看到数据里面有data,target,frame,target_names,DESCR等
单独打印出DESCR查看,里面会记录一些属性,特征等

print("描述\n", iris['DESCR'])

在这里插入图片描述
在这里插入图片描述

3.切分数据集

scikitlearn里面自带有切割方法, train_test_split,这个方法在sklearn.model_selection里面,sklearn.model_selection 方法参考
导入切割方法

from sklearn.model_selection import train_test_split

用四个变量来接收训练集和测试集的数据和目标

x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
print("测试集的特征值\n", x_test)

iris.data,和iris.target表示需要切分的数据特征和目标
test_size=0.2是指测试集占整个数据集的百分比
random_state=22,表示用22号随机种子,在以后测量模型好坏的时候,需要用一样的随机种子,大部分时候可以不写
将切好的测试集打印出来如下图,明显感觉比原来的数据集小了很多。
在这里插入图片描述

def dataset_demo():
    """
    sklearn数据集调用
    :return:
    """
    # 获取数据集
    iris =load_iris()
    print("花数据集:\n", iris)
    print("描述\n", iris['DESCR'])
    print("查看特征值的名字\n", iris.target_names)

    # 数据集的划分
    x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)
    print("测试集的特征值\n", x_test)
    return None

二、特征工程

1.字典提取

计算机中只能处理数字,所以对于现实生活中的失误我们需要将其特征转变为数字的形式来进行处理,所以就需要进行特征提取,特征提取所用到的库是sklearn.feature_extraction,具体的方法查看连接sklearn.feature_extraction
我们对字典进行特征提取 用到DictVectorizer(sparse=)方法,sparse表示是否使用稀疏矩阵,填bool类型
DictVectorizer.fit_transfrom(X) X:字典或者包含字典的迭代器返回值:返回矩阵sparse矩阵
DictVectorizer.fit_transfrom(X) X:array数组或者sparse矩阵 返回值:转换之前的数据格式
DictVectorizer.get_faeture_names() 返回类别名称

from sklearn.feature_extraction import DictVectorizer
def dict_feature():
    """
    字典的特征提取
    :return:
    """
    data = [{'human': 'sjy', 'temperature': 174}, {'human': 'zy', 'temperature': 164}, {'human': 'czq', 'temperature': 172}]
    # 实例化一个转换器类
    transfer = DictVectorizer(sparse=False)

    # 调用fit_transform()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

    return None

结果为
在这里插入图片描述
如果使用稀疏矩阵
在这里插入图片描述
稀疏矩阵的好处是为了加快效率,减小内存消耗,稀疏矩阵左边是坐标,右边是数值
对于不同的特征值一般都才用one-hot来表示,one-hot编码表示有几个类别就就生成几行,每行只有一个1,而这个位置就表示一个位置,如上图010 100 001 分别表示不同类别,在机器学习中如果采用数字来表示不同的类别,在进行学习的时候,就可能存在优先级,比如用1表示人,用2表示企鹅,本质上人和企鹅都只是生物,但是2比1大,存在一个优先级问题,所以一般采用one-hot编码通过位置来表示不同的类别。
应用场景:数据集中类别特征比较多的情况下,一般将数据集的特征转换成字典,

2.文字提取

一般以单词作为特征,称为特征词
sklearn.feature_extraction.text
CountVectorizer(stop_words=[”“]) 停用词,不计入特征列表
CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象 返回值为spares矩阵
CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵,返回值为转换之前的数据格式
CountVectorizer.get_feature_names() 返回单词表

from sklearn.feature_extraction.text import CountVectorizer
def Text_feature():
    """
    文本特征提取
    :return:
    """
    data = ["The advantage of sparse matrix is to speed up efficiency and reduce memory consumption. The left side of sparse matrix is the coordinate and the right side is the valueDifferent eigenvalues are generally represented by one-hot coding. One-hot coding means that if there are several categories, several lines will be generated, each line has only one 1, and this position represents a position. As shown in the figure 010, 100, 001 represent different categories. "
            "For example, 1 is used to represent human and 2 is used to represent penguin. In essence, both human and penguin are just creatures, but 2 is larger than 1, so there is a priority problem. Therefore, one-hot coding is generally used to represent different categories through positions."]
    # 1.实例化一个转换器
    transfer = CountVectorizer()
    # 2.调用fit_transform
    data_new = transfer.fit_transform(data)
    print("文本特征提取\n", data_new)
    print("特征名字\n", transfer.get_feature_names())
    return None

在这里插入图片描述
返回的结果是不同位置上字母的出现次数
在这里插入图片描述
中文文字提取需要使用jieba分词,按照原本的方式会默认的把一句话分为一个词,所以需要jieba分词将中文里面的词分开

def Chinese_word_cut(text=[]):
    """
    中文分割
    :return:
    """
    return " ".join(list(jieba.cut(text)))
def Chinese_feature():
    """
    文本特征提取
    :return:
    """
    # 1.导入数据且切分
    data = ["稀疏矩阵的好处是为了加快效率,减小内存消耗,稀疏矩阵左边是坐标,右边是数值对于不同的特征值一般都才用one-hot来表示,one-hot编码表示有几个类别就就生成几行,每行只有一个1,而这个位置就表示一个位置,如上图010 100 001 分别表示不同类别,在机器学习中如果采用数字来表示不同的类别,在进行学习的时候,就可能存在优先级,比如用1表示人,用2表示企鹅,本质上人和企鹅都只是生物,但是2比1大,存在一个优先级问题,所以一般采用one-hot编码通过位置来表示不同的类别。"]
    data_cut = []
    data_cut.append(Chinese_word_cut(data[0]))
    print(data_cut)
    # 2.实例化一个转换器
    transfer = CountVectorizer()
    # 3.调用fit_transform
    data_new = transfer.fit_transform(data_cut)
    print("文本特征提取\n", data_new)
    print("特征名字\n", transfer.get_feature_names())
    return None

文本特诊提取的另外一种方式TF-IDF的方式,根据词语在整个语料库中出现的次数,和该文章出现的次数,来判断该词语对于该文章的重要次数。通过计算TF-IDF来判断。
TF是指该单词在所在文章中出现的次数比例,如果该文章有100个词语,这个词出现了10次,那么FT就等于10/100=0.1 IDF是指所有文章数量除以该单词出现过的文章数量取对数,假如有1000篇文章,其中100篇出现了“我”,那么我这个词的TF就是lg(1000/100)=2, TF-IDF就等于0.1x2=0.2
用法和CountVectorizer一样

def TF_IDF_text_feature():
    """
    用TF_IDF进行文本提取
    :return:
    """
    # 1.导入数据且切分
    data = [
        "稀疏矩阵的好处是为了加快效率,减小内存消耗,稀疏矩阵左边是坐标,右边是数值对于不同的特征值一般都才用one-hot来表示,one-hot编码表示有几个类别就就生成几行,每行只有一个1,而这个位置就表示一个位置,如上图010 100 001 分别表示不同类别,在机器学习中如果采用数字来表示不同的类别,在进行学习的时候,就可能存在优先级,比如用1表示人,用2表示企鹅,本质上人和企鹅都只是生物,但是2比1大,存在一个优先级问题,所以一般采用one-hot编码通过位置来表示不同的类别。"]
    data_cut = []
    data_cut.append(Chinese_word_cut(data[0]))
    print(data_cut)
    # 2.实例化一个转换器
    transfer = TfidfVectorizer()
    # 3.调用fit_transform
    data_new = transfer.fit_transform(data_cut)
    print("文本特征提取\n", data_new)
    print("特征名字\n", transfer.get_feature_names())
    return None

在这里插入图片描述

3.无量纲化

1) 归一化

归一化数学原理
在这里插入图片描述

def min_max():
    """
    数据归一化
    :return:
    """
    # 导入数据
    data = [" "]
    # 实例化一个转换器
    transfer = MinMaxScaler()
    # 调用调用fit_transform
    datanew = transfer.fit_transform(data)
    return None

2) 标准化

根据归一化的原理,归一化的数据是通过最大值和最小值计算了,但是如果最大值和最小值是异常值,通过归一化来进行无量纲化,就可能出现误差,所以通过就标准差的方法来解决这个问题。
在这里插入图片描述

def StandardScaler():
    """
        数据标准化
        :return:
        """
    # 导入数据
    data = [" "]
    # 实例化一个转换器
    transfer = StandardScaler()
    # 调用调用fit_transform
    datanew = transfer.fit_transform(data)
    return None

4.特征选取

1)Filter过滤式

(1)方差过滤法

方差是表示离散程度的量,如果一个特征波动不是很大,那就说明这个特征不是关键因素,所以选择性的剔除,根据方差的特点方法越大离散程度越大(波动越大),所以可以选择性的剔除方差小的特征

def variance():
    """
    过滤地方差特征
    :return:
    """
    # 导入数据
    data = [" "]
    # 实例化一个转换器
    transfer = VarianceThreshold(threshold=0)    # 默认是剔除方差为0的数据
    # 调用调用fit_transform
    datanew = transfer.fit_transform(data)
    return None
(2)相关系数

皮尔逊相关系数
在这里插入图片描述
相关系数介于-1到1之间,大于0表示正相关,小于0表示负相关,等于0表示没什么关系,系数越接近于1说明正相关性越强,反之系数越接近于-1说明负相关性越强

通过scipy模块中的pearsonr方法来计算皮尔逊系数
相关性越强说明两个特征对结果的影响是相似的,所以可以选择性的处理掉多余的数据
相关性系数处理方法
1.选取一个具有代表性的特征
2.加权求和
3.主成分分析法

(3)主成分分析法

主成分分析法,选取一种适合的方式,将特征竟可能的保留下来
在这里插入图片描述

def PCA_test():
    """
    主成分分析
    PCA降维
    :return:
    """
    data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]
    # 1.实例化
    transfer = PCA(n_components=1)
    # 2.调用
    datanew = transfer.fit_transform(data)
    print(datanew)
    return None
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值