机器学习之特征工程

机器学习所需要的环境
1.Python的安装
2.Numpy:Python语言的科学计算库支持,提供了线性代数、傅里叶变换等非常有用的数学工具
3.Scikit-Learn:针对Python 编程语言的免费软件机器学习库,里面包含了各种常见的机器学习算法
4.Pandas:Python语言中知名的数据处理库
5.Scipy:Scipy是一个用于数学、科学、工程领域的常用软件包,可以处理插值、积分、优化、图像处理、常微分方程数值解的求解、信号处理等问题。它用于有效计算Numpy矩阵,使Numpy和Scipy协同工作,高效解决问题

机器学习的开发流程
1.获取数据
2.数据处理
3.特征工程
4.机器学习算法训练–模型
5.模型评估
6.应用

初学机器学习时,遇到最大的问题就是迷茫,对此我深有体会,面对机器学习领域数量繁多由互有交叉的知识点,就像身处一大片繁茂的森林,没有指南设备很难不迷失方向,就比如我刚学习时打开课本看到的是这样的一幅画面
在这里插入图片描述
各种密密麻麻的数学公式让人很苦恼,根本读不下去,所以我个人认为学习机器学习比较有效的方法就是先确定主题,然后勾勒整体脉络,最后才是添加细节。

接下来我要介绍的就是关于特征工程的内容,以及代码的演示

1.调用数据集,数据集划分
在这里插入图片描述
这里我们调用sk-learn中经典的鸢尾花数据集进行演示,这里需要调用sk-learn中的数据集在这里插入图片描述
运行结果如图
在这里插入图片描述

在这里插入图片描述
我们可以看到返回的数据集是字典对象,用train_test_split函数可以把数据集划分成我们指定百分比训练集和测试集
2.字典特征提取

def dic_demo():
    #字典特征提取
    data=[{'city':'北京', 'temperature':'100'}, {'city':'上海', 'temperature':'60'}, {'city':'深圳', 'temperature':'30'}]
    #实例化一个转换器类
    transfer=DictVectorizer(sparse=False)
    data_new=transfer.fit_transform(data)
    print("data_new:\n",data_new)
    print("特征名字:\n",transfer.get_feature_names())
    return None

这里同样需要导包

from sklearn.feature_extraction import DictVectorizer

在我们实例化转化器类时,它默认返回的是一个spars(稀疏)矩阵,如图所示
在这里插入图片描述
如果想要返回二维数组的话我们需要让DictVectorizer中的参数改为sparse=False
在这里插入图片描述
3.英文文本提取

def count_demo():
    #英文文本特征提取
    data=["life is too short,i like like python", "life is too long,i dislike python"]
    transfer=CountVectorizer(stop_words=["is","too"])
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())

导包

from sklearn.feature_extraction.text import CountVectorizer

CountVectorizer统计样本单词出现的数量
stop_words 表示将我们认为关联性不大的关键词给剔除
在这里插入图片描述

4.中文文本提取

def count_chinese_demo():
    中文文本特征提取
    data = ["我 爱 北京 天安门", "天安门 的 太阳 升起"]
    transfer = CountVectorizer()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())

此函数会自动提取中文文本里面的关键词,并返回一个统计关键词数量的数组
在这里插入图片描述
不过这种方法有个弊端,就是需要我们自己手动分词

我们可以创建一个中文分词函数,调用jieba库函数进行自动分词,不过调用这个拓展库之前要先安装

def cut_word(text):
    '''
    进行中文分词
    :param text:
    :return:
    '''
    str=" "
    text = str.join(list(jieba.cut(text)))
    return text

然后我们可以在中文分词的函数中调用这个函数

def count_chinese_demo():
    #中文文本特征提取
    # data = ["我 爱 北京 天安门", "天安门 的 太阳 升起"]
    # transfer = CountVectorizer()
    # data_new = transfer.fit_transform(data)
    # print("data_new:\n", data_new.toarray())
    # print("特征名字:\n", transfer.get_feature_names())


    data=["实现中华民族伟大复兴的中国梦,就是要实现国家富强,民族振兴,人民幸福",
    "中国梦归根到底是人民的梦,必须紧紧依靠人民来实现,必须不断为人民造福",
    "我们将高举和平、发展、合作、共赢的旗帜,始终不渝走和平发展道路,始终不渝奉行互利共赢的开放战略"]
    data_new=[]
    for word in data:
        data_new.append(cut_word(word))
    print(data_new)
    transfer = CountVectorizer()
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())

在这里插入图片描述
你以为这样文本特征的抽取就完美了吗,当然不是的,就比如不同类型的文章当中都会出现大量的例如 ‘因为’ ‘所以’ 这样的词,这样的词可以作为关键词供我们分类吗,答案当然是否定的,那么如何解决这种问题呢,这就需要用到TfidfVectorizer函数
TfidfVectorizer函数的中心思想就是如果一个词在某种文章中出现次数很多,在其他文章中出现很少,那么这个词就可以更适合用来分类
如够用tf来表示词频的话(即一个词在文件中出现的频率)用idf来表示逆向文档频率(即代表一个词普遍重要性的度量,可以由文件总数除以包含该词语的文件数目,再将得到的商取以10为底的对数得到)那么词的重要程度tfidf就等于tf*idf

def tfidf_demo():
    """
    用tfidf的方法进行文本特征抽取
    :return:
    """
    data = ["实现中华民族伟大复兴的中国梦,就是要实现国家富强,民族振兴,人民幸福",
            "中国梦归根到底是人民的梦,必须紧紧依靠人民来实现,必须不断为人民造福",
            "我们将高举和平、发展、合作、共赢的旗帜,始终不渝走和平发展道路,始终不渝奉行互利共赢的开放战略"]
    data_new = []
    for word in data:
        data_new.append(cut_word(word))
    print(data_new)
    transfer = TfidfVectorizer()
    data_final = transfer.fit_transform(data_new)
    print("data_new:\n", data_final.toarray())
    print("特征名字:\n", transfer.get_feature_names())

代码和之前的一样,只需要把CountVectorizer改成TfidfVectorizer就行了,而且导包时只需要在CountVectorizer的后面添加上逗号和TfidfVectorizer就行了
在这里插入图片描述
5.数据预处理–归一化

为什么数据要进行归一化呢,就比如图中的一组数据,不同特征的值差别可能会很大,这时候我们进行特征提取时就会对我们的结果产生很大的影响,导致特征值比较小的特征就影响就很小,这时候就需要进行归一化,使每个特征同等重要
在这里插入图片描述
归一化
公式
z = (x - min) / (max - min)

对每个值x,减去其所在列的最小值min,再除以所在列的极差(最大值与最小值之差),得到的就是归一化后的值z。每列的归一化独立进行,归一化后的数据每列的取值范围为[0, 1]。

def minmax_demo():
    """
    归一化数据
    :return:
    """
    data=pd.read_csv('data.csv')
    data=data.iloc[:,:3]
    print("data:\n",data)
    #实列化一个转换器类
    transfer = MinMaxScaler()#默认MinMaxScaler(feature_range=[0,1])
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

数据经过归一化之后就会把特征值都化成我们指定的范围内
导入数据时我们可以先把信息在excel中进行填写,然后把它另存为csv文件,然后再通过pd.read_csv(‘data.csv’)将我们文件中的数据存入到我们的数据中
这里需要导包

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

归一化后图中数据如下
在这里插入图片描述
6.数据预处理–标准化
但是归一化也有一个缺点,就是容易受到异常值的影响,只适用于小数据的处理场景

标准化就是对数据进行变换,把数据变换为均值为0标准差为1的范围内

标准化
公式
z = (x - u) / s

对每个值x,减去其所在列的平均值u,再除以所在列的标准差s,得到的就是标准化后的值z。每列的标准化独立进行,标准化后的数据每列的均值为0,标准差为1。

def stand_demo():
    """
    标准化
    :return:
    """
    data = pd.read_csv('data.csv')
    data = data.iloc[:, :3]
    print("data:\n", data)
    # 实列化一个转换器类
    transfer = StandardScaler()
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

导包

from sklearn.preprocessing import StandardScaler

在这里插入图片描述
7.降维
降维是指在某些特定条件下,降低特征个数,得到一组‘不相关’主变量的过程

降维的两种方式:
1.特征选择
Fitter过滤式:主要探究特征本身特点、特征与特征和目标值之间的关系
1.方差选择法—低方差过滤
2.相关系数—特征与特征之间的相关程度

def variance_demo():
    """
    低方差特征过滤
    :return:
    """
    data = pd.read_csv('data.csv')
    data = data.iloc[:, :]
    print("data:\n", data)
    # 实列化一个转换器类
    transfer = VarianceThreshold()#里面参数threshold=多少需要我们自己设置,默认为0
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new,data_new.shape)在这里插入代码片

导包

from sklearn.feature_selection import VarianceThreshold

在这里插入图片描述
经过低方差过滤后,原本6个特征,不过最后一个boolean特征方差为0就被过滤掉了,只剩下了5个特征

def variance_demo():
    """
    低方差特征过滤
    :return:
    """
    data = pd.read_csv('data.csv')
    data = data.iloc[:, :]
    print("data:\n", data)
    # 实列化一个转换器类
    transfer = VarianceThreshold()
    #计算相关系数
    r=pearsonr(data["litters"],data["milage"])
    print("相关系数:\n",r)

导包

from scipy.stats import pearsonr

这里我计算的是litters与milage两个特征之间的相关系数
在这里插入图片描述
如果特征与特征之间相关性系数很高的话
1.选择其中一个作为代表
2.加权求和
3.主成分分析(即自动地将一些相关性很强的特征处理掉)

主成分分析
定义:高维数据转化为低维数据的过程,此过程中可能会舍弃原有数据,创造出新的变量
作用:使数据维数压缩,尽可能地将降低原数据的维数,损失少量信息

def pca_demo():
    data=[[2,8,4,5],[6,3,8,8],[5,4,0,1]]
    transfer=PCA(n_components=2)#整数的话代表把特征量降低到多少
    #这里如果是小数的话表示保存多少的信息
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new)

导包

from sklearn.decomposition import PCA

在这里插入图片描述

这里原本4个特征,此时已经被降为两个

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值