Python机器学习—特征工程
文章目录
- 1、数据集
- 1.1 可用数据集
- 1.2 scikit-learn数据集
- sklearn小数据集
- sklearn大数据集
- 1.3 数据集的划分
- 数据集划分API
- 2.特征工程
- 2.1特征工程包含内容
- 3.特征提取
- 3.1字典特征提取
- 3.2 文本特征提取
- 3.3中文文本特征提取
- 3.4 Tf-idf文本特征提取
- 公式
- 4.特征预处理
- 4.1 归一化
- 4.2 标准化
- 5. 特征降维
- 5.1 特征选择
- 5.1.1 低方差特征过滤
- 5.1.2 相关系数
- 6. 主成分分析
- 总结
1、数据集
1.1 可用数据集
Kaggle网址:https://www.kaggle.com/datasets
UCI数据集网址: http://archive.ics.uci.edu/ml/
scikit-learn网址:https://scikit-learn.org/stable/
1.2 scikit-learn数据集
- load_* 获取小规模数据集,数据包含在datasets里
- fetch_* 获取大规模数据集,需要从网络上下载,函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/
sklearn小数据集
def datasets_demo():"""sklearn数据集使用:return:"""# 获取数据集iris = load_iris()print("鸢尾花数据集:\n", iris)print("查看数据集描述:\n", iris["DESCR"])print('鸢尾花的目标值:\n', iris.target)print("查看特征值的名字:\n", iris.feature_names)print("鸢尾花目标值的名字:\n", iris.target_names)print("查看特征值:\n", iris.data, iris.data.shape)# 数据集划分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_train, x_train.shape)return None
sklearn大数据集
sklearn.datasets.fetch_20newsgroups(data_home=None,subset=‘train’)
- subset:‘train’或者’test’,‘all’,可选,选择要加载的数据集。
- 训练集的“训练”,测试集的“测试”,两者的“全部”
1.3 数据集的划分
- 训练数据:用于训练,构建模型
- 测试数据:在模型检验时使用,用于评估模型是否有效,测试集一般在20%~30%
数据集划分API
sklearn.model_selection.train_test_split(arrays, *options)
- x 数据集的特征值
- y 数据集的标签值
- test_size 测试集的大小,一般为float
- random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
- return 测试集特征训练集特征值值,训练标签,测试标签(默认随机取)
# 数据集划分
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_train, x_train.shape)
2.特征工程
特征工程是使用专业背景知识和技巧处理数据,使得特征能在机器学习算法上发挥更好的作用的过程。
- 意义:会直接影响机器学习的效果
2.1特征工程包含内容
- 特征抽取
- 特征预处理
- 特征降维
3.特征提取
特征提取是将任意数据(如文本或图像)转换为可用于机器学习的数字特征
- 字典特征提取(特征离散化)
- 文本特征提取
- 图像特征提取(深度学习将介绍)
特征提取API:sklearn.feature_extraction
3.1字典特征提取
def dict_demo():"""字典特征提取:return:"""data = [{'city': '北京', 'temperature': 100},{'city': '上海', 'temperature': 60},{'city': '深圳', 'temperature': 30}]# 1.实例化一个转换器类transfer = DictVectorizer(sparse=False)# 2.调用fit_transform()data_new = transfer.fit_transform(data)print('data_new\n', data_new)print("特征名字: \n", transfer.get_feature_names())return None
3.2 文本特征提取
def count_demo():"""文本特征抽取:CountVecotrizer:return:"""data = ["Life is short, i like like python", "life is too long, i dislike python"]# 1.一个转换器类transfer = CountVectorizer(stop_words=['is', 'too']) # 停用词不统计# 2.调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new.toarray())print("特征名字:\n", transfer.get_feature_names())return None
3.3中文文本特征提取
def cut_word(text):"""进行中文分词:“我爱北京天安门” --->"我 爱 北京 天安门":param text::return:"""text = " ".join(list(jieba.cut(text)))return textdef count_chinese_demo2():"""中文文本特征抽取,自动分词:return:"""# 1.将中文文本进行分词data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new = []for sent in data:data_new.append(cut_word(sent))# print(data_new)# 2.实例化一个转换器类transfer = CountVectorizer(stop_words=['一种', '因为'])# 3.调用fit_transformdata_final = transfer.fit_transform(data_new)print("data_new:\n", data_final.toarray())print("特征名字:\n", transfer.get_feature_names())return None
3.4 Tf-idf文本特征提取
- TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。
- TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。
公式
- 词频(term frequency,tf)指的是某一个给定的词语在该文件中出现的频率
- 逆向文档频率(inverse document frequency,idf)是一个词语普遍重要性的度量。某一特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到
def tfidf_demo():"""用tfidf的方法进行文本特征提取:return:"""# 1.将中文文本进行分词data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝对大部分是死在明天晚上,所以每个人不要放弃今天。","我们看到的从很远星系来的光是在几百万年之前发出的,这样当我们看到宇宙时,我们是在看它的过去。","如果只用一种方式了解某样事物,你就不会真正了解它。了解事物真正含义的秘密取决于如何将其与我们所了解的事物相联系。"]data_new = []for sent in data:data_new.append(cut_word(sent))# print(data_new)# 2.实例化一个转换器类transfer = TfidfVectorizer(stop_words=["一种", '因为'])# 3.调用fit_transformdata_final = transfer.fit_transform(data_new)print("data_new:\n", data_final.toarray())print("特征名字:\n", transfer.get_feature_names())return None
4.特征预处理
通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
原因:特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,容易影响(支配)目标结果,使得一些算法无法学习到其它的特征
数值型数据的无量纲化:
- 归一化
- 标准化
API:sklearn.preprocessing
4.1 归一化
通过对原始数据进行变换把数据映射到(默认为[0,1])之间
def minmax_demo():"""归一化:return:"""# 1.获取数据data = pd.read_csv('dating.txt')data = data.iloc[:, :3]# print("data:\n", data)# 2.实例化一个转换器类transfer = MinMaxScaler()# 3.调用fit_transformdata_new = transfer.fit_transform(data)print("data_new:\n", data_new)return None
注意:最大值最小值是变化的,另外,最大值与最小值非常容易受异常点影响,所以这种方法鲁棒性(健壮性)较差,只适合传统精确小数据场景。
4.2 标准化
通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内
- 对于归一化来说:如果出现异常点,影响了最大值和最小值,那么结果显然会发生改变
- 对于标准化来说:如果出现异常点,由于具有一定数据量,少量的异常点对于平均值的影响并不大,从而方差改变较小。
def stand_demo():"""标准化:return:"""# 1. 获取数据data = pd.read_csv('dating.txt')data = data.iloc[:, :3]print('data:\n', data)# 2.实例化一个转换器类transfer = StandardScaler()# 3.调用fit_transform()data_new = transfer.fit_transform(data)print('data_new:\n', data_new)return None
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。
5. 特征降维
降维是指在某些限定条件下,降低随机变量(特征)个数,得到一组“不相关”主变量的过程
降维的两种方式
- 特征选择
- 主成分分析(可以理解一种特征提取的方式)
5.1 特征选择
数据中包含冗余或无关变量(或称特征、属性、指标等),旨在从原有特征中找出主要特征。
方法:
- Filter(过滤式):主要探究特征本身特点、特征与特征和目标值之间关联
方差选择法:低方差特征过滤
相关系数 - Embedded (嵌入式):算法自动选择特征(特征与目标值之间的关联)
决策树:信息熵、信息增益
正则化:L1、L2
深度学习:卷积等
API:sklearn.feature_selection
5.1.1 低方差特征过滤
删除低方差的一些特征,前面讲过方差的意义。再结合方差的大小来考虑这个方式的角度。
- 特征方差小:某个特征大多样本的值比较相近
- 特征方差大:某个特征很多样本的值都有差别
def variance_demo():"""过滤低方差特征:return:"""# 1. 获取数据data = pd.read_csv('factor_returns.csv')data = data.iloc[:, 1:-2]print('data:\n', data)# 2. 实例化一个转换器类transfer = VarianceThreshold(threshold=10)# 3. 调用fit_transform()data_new = transfer.fit_transform(data)print('data_new:\n', data_new, data_new.shape)return None
5.1.2 相关系数
皮尔逊相关系数(Pearson Correlation Coefficient)
- 反映变量之间相关关系密切程度的统计指标
def pearsonr_demo():"""相关系数计算:return: None"""data = pd.read_csv("factor_returns.csv")data = data.iloc[:, 1:-2]# 计算某两个变量之间的相关系数r1 = pearsonr(data['pe_ratio'], data['pb_ratio'])print('pe_ratio与pb_ratio相关系数:\n', r1)r2 = pearsonr(data['revenue'], data['total_expense'])print('revenue与total_expense相关系数:\n', r2)return None
6. 主成分分析
定义:高维数据转化为低维数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
作用:是数据维数压缩,尽可能降低原数据的维数(复杂度),损失少量信息。
应用:回归分析或者聚类分析当中
def pca_demo():"""PCA降维:return:"""data = [[2, 8, 4, 5], [6, 3, 0, 8], [5, 4, 9, 1]]# 1.实例化一个转换器类transfer = PCA(n_components=2)# 2. 调用fit_transform()data_new = transfer.fit_transform(data)print('data_new:\n', data_new)return None
总结
关于本节所有代码及数据集相关文件参考如下链接:
https://download.csdn.net/download/qq_45625499/21048609?spm=1001.2014.3001.5501
Python机器学习—特征工程相关推荐
- 特征工程用java或python,机器学习-特征工程-Feature generation 和 Feature selection(示例代码)...
Feature generation.对于这个技术点,其实没有什么诀窍,就是一个,深刻理解咱们的数据的意义再加上一点点创造力.大家是不是很懵逼,哈哈,这就完啦????哈哈当然不是啦,但是这一块缺失没有 ...
- 机器学习-特征工程中的特征降维
对于一个机器学习问题,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.由此可见,数据和特征在模型的整个开发过程中是比较重要.特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为 ...
- 机器学习实战 | 机器学习特征工程最全解读
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/article-d ...
- 机器学习特征工程之连续变量离散化:聚类法进行分箱
机器学习特征工程之连续变量离散化:聚类法进行分箱 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均,会不停的听新的歌曲, ...
- 机器学习特征工程之连续变量离散化:等频分箱
机器学习特征工程之连续变量离散化:等频分箱 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均,会不停的听新的歌曲,但是有 ...
- 机器学习特征工程之连续变量离散化:连续变量二值化(Binarizer)
机器学习特征工程之连续变量离散化:连续变量二值化(Binarizer) 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均 ...
- 机器学习特征工程之连续变量离散化:等宽分箱
机器学习特征工程之连续变量离散化:等宽分箱 离散化,就是把无限空间中有限的个体映射到有限的空间中: 根据用户的听音乐的数据来预测哪些歌曲更受欢迎. 假设大部分人听歌都很平均,会不停的听新的歌曲,但是有 ...
- 机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)
机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler) 在Andrew Ng的机器学习课程里面,讲到使用梯度下降的时候应当进行特征缩放(Feature Scaling).进行 ...
- 机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler)
机器学习特征工程之特征缩放+无量纲化:最小最大缩放(MinMaxScaler) 在Andrew Ng的机器学习课程里面,讲到使用梯度下降的时候应当进行特征缩放(Feature Scaling).进行缩 ...
最新文章
- [ME]不知道第几次学c语言,仍觉得水深莫测
- django中model模型
- 调整xfce中的鼠标大小到48以上-目前还没有完成
- usb扩展坞同时接键盘鼠标_轻薄本的办公伴侣,ORICO十一合一扩展坞体验
- OJ1013: 求两点间距离
- centos mysql无法启动 sock_【零基础学云计算】MYSQL的主从复制、读写分离
- Git@OSC 已经支持 Gitlab Control 移动客户端
- 通过Linux的rpm方式安装mysql
- 机器学习之初识SVM
- 开始使用Mac OS X——写给Mac新人
- 组合模式-系统菜单的设计
- 笔记本查看WIFI密码
- 思考怎么成为一名合格的技术总监?
- 比尔·盖茨的另一扇视窗
- UNIX常用命令(C站最全,一文通关)
- (转)fock函数详解
- 试着让动态代理变得通俗易懂,通过三个案例
- js中Boolean值为false和true的情况:
- 利用pycharm使用pytorch
- ios 音乐合成(混合)