少女祈祷中...

sklearn与特征工程

简介

sklearn

Scikit-learn(简称为 sklearn)是一个流行的 Python 机器学习库,用于在数据挖掘和数据分析领域中进行各种机器学习任务。它提供了简单而高效的工具,用于数据挖掘和数据分析,以及构建和评估各种机器学习模型。以下是关于 scikit-learn 的一些重要信息:

功能特点

  1. 简单而一致的 API: Scikit-learn 提供了简单而一致的 API,使得用户可以方便地使用各种机器学习算法和工具。
  2. 广泛的算法库: Scikit-learn 包含了大量的机器学习算法和工具,涵盖了分类、回归、聚类、降维、模型选择、预处理等多个方面。
  3. 易于使用的工具: Scikit-learn 提供了各种易于使用的工具,如数据预处理、特征提取、模型评估等,使得用户能够更轻松地进行机器学习任务的建模和评估。
  4. 高效的实现: Scikit-learn 的算法和工具都经过了高度优化和性能调整,以保证其在大规模数据集上的高效性和可扩展性。

主要模块

  1. sklearn.datasets: 包含了一些标准数据集,可以用于练习和测试机器学习算法。
  2. sklearn.preprocessing: 提供了数据预处理功能,如标准化、归一化、缺失值处理等。
  3. sklearn.feature_extraction: 提供了特征提取功能,如文本特征提取、图像特征提取等。
  4. sklearn.model_selection: 提供了模型选择和评估功能,如交叉验证、网格搜索、模型评估指标等。
  5. sklearn.metrics: 提供了常用的模型评估指标,如准确率、精确率、召回率、F1 值等。
  6. sklearn.linear_model: 提供了线性模型算法,如线性回归、逻辑回归等。
  7. sklearn.svm: 提供了支持向量机算法。
  8. sklearn.tree: 提供了决策树算法。
  9. sklearn.ensemble: 提供了集成学习算法,如随机森林、梯度提升树等。
  10. sklearn.cluster: 提供了聚类算法,如 K 均值聚类、层次聚类等。

特征工程

特征工程是指在机器学习任务中使用的数据预处理和特征处理技术,旨在提取、构建和选择对模型训练有用的特征,从而改善模型的性能。特征工程是机器学习中非常重要的一部分,它直接影响到模型的性能和泛化能力。

包括特征提权,特征转化,特征降维

数据集操作

软件包

  • sklearn.datasets

加载获取数据集

  1. datasets.load_*()

获取小规模数据集,默认在库中包含有

  1. datasets.fetch_*(data_home=None)

获取大规模数据集,需要从网络上下载,函数的第一个参数表示数据集下载路径,默认是~/scikit_learn_data/

示例

import sklearn.datasets
data=sklearn.datasets.load_iris()

数据集对象

load和fatch返回的数据类型是datasets.base.Bunch(继承于字典)

属性

  • data:特征数据数组,是二维numpy.ndarray数组
  • target:标签数组,是numpy.ndarray数组
  • DESCR: 数据描述
  • target_names: 标签名
  • feature_names: 特征名

数据集划分

一般使用20%~30%的数据用于测试

  • sklearn.model_selection.train_test_split(arrays,*options)
  1. x数据集的特征值
  2. y数据集的标签值
  3. test_size:测试集大小,为float,默认为0.25
  4. random_state:随机数种子

返回值: 训练集特征值,测试集特征值,训练集目标值,测试集目标值

import sklearn.datasets
from sklearn.model_selection import train_test_split
iris=sklearn.datasets.load_iris()
x_train,x_test,y_train,y_test=train_test_split(iris.data,iris.target,test_size=0.2,random_state=18)

特征提取

概念:将任意数据(如文本或图像)转化为可用于机器学习的数字特征

分类:

  • 字典特征提权(特征离散化)
  • 文本特征提取
  • 图像特征提权

特征提取api

sklearn.feature_extraction

字典特征提取

sklearn.feature_extraction.DictVectorizer(sparse=True,…) –实例化转化器

作用:对字典数据进行特征值化

默认返回sparse矩阵,若返回正常矩阵,设置sparse=False

(类别采用one-hot编码)

sparse矩阵:将非零值按照位置(元组)表示出来

转化为:

矩阵 matrix 二维数组

向量 vector 一维数组

类方法

  • fit_transform( X )

X:字典或者字典的迭代器,返回sparse(稀疏)矩阵

  • inverse_transform(X)

X:array或者sparse矩阵,返回值:转化之前的数据格式

  • get_feature_names_out(X)

X:前面得到的特征矩阵,返回类别名称

from sklearn.feature_extraction import DictVectorizer
data=[
{"city":"北京","temperature":23},
{"city":"上海","temperature":21},
{"city":"广州","temperature":30},
]
dictVector=DictVectorizer(sparse=False)
new_data=dictVector.fit_transform(data)
names=dictVector.get_feature_names_out(new_data)
print(names)
print(new_data)
print(dictVector.inverse_transform(new_data))

应用场景:

若数据集类别多,先将数据集转为字典,再进行特征提权

文本特征提取

  1. CountVectorizer

类:

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

stop_words:停用词,不纳入特征值的词

方法同字典特征提取

toarray()–将结果对象转为二维数组

将每条数据(句子)统计单词数

英文

from sklearn.feature_extraction.text import CountVectorizer
data="I like to have a book.I like go to like good college and eat beef.I am a student of computer science".split(".")
count_vector = CountVectorizer()
new_data=count_vector.fit_transform(data)
print(new_data.toarray())
print(count_vector.get_feature_names_out(new_data))

中文需要进行词组间加空格

使用第三方库:jieba.cut()

  1. Tf-idf文本特征提权

TF-IDF的主要思想是:如果某个词或者短语在一篇文章中出现的概率高,并且在其他文章很少出现,则认为此词或者短语具有很好的区分能力,适合用来分类。

TF-IDF作用: 用以评估一字词对于一个文件集或者一个语料库中其中一份文件的重要程度

公式

  • 词频(term frequency, tf):指的是某一个给定的词语在该文件中出现的频率
  • 逆向文档率(inverse document frequency,idf):是一个词语普遍重要性的度量,

某一个特定词语的idf,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取以10为底的对数得到

$$tfidf_(ij)=tf_(ij) X idf_i$$

类:

sklearn.feature_extraction.text.TfidfVectorizer

特征转化

数值型数据的无量纲化:

  • 归一化
  • 标准化

API:

sklearn.preprocessing

需求:

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

归一化

  1. 定义:通过原始数据进行变换把数据映射到默认为(0,1)之间

  2. 公式:

$$X’=\frac{x-min}{max-min}$$

$$X’’=X’*(mx-mi)+mi$$

作用于每一列,max为一列的最大值,min为一列最小值,那么X’为最终结果,mx,mi分别为指定区间,mx默认为1,mi默认为0

  1. 类:

sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)…)

方法:

  • fit_transform(X) :返回处理后相同形状的数组
import sklearn.datasets as datasets
from sklearn.preprocessing import MinMaxScaler
iris=datasets.load_iris()

def for_one():
scaler=MinMaxScaler()
new_data=scaler.fit_transform(iris.data)
print(new_data)
  1. 特点

最大值和最小值容易受到异常点影响,所以只适合传统精确小数据场景

标准化

  1. 定义

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

  1. 公式

$$X’=\frac{x-mean}{\sigma}$$

作用于每一列,mean为平均值,$$\sigma$$为标准差

sklearn.preprocessing.StandardScaler()

方法:

  • fit_transform(X) :返回处理后相同形状的数组
  1. 特点

弥补了归一化缺陷

减少了一异常值对结果的影响,适合于大数据场景

特征降维

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

特征选择

  1. 定义

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

  1. 方法

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

  • 方差选择法:低方差特征过滤
  • 相关系数

Embedded(嵌入式):算法自动选择特征(特征与目标值之间的关联)

  • 决策树:信息熵、信息增益
  • 正则化:L1,L2
  • 深度学习:卷积等
  1. 模块
sklearn.feature_selection
  1. 过滤式

低方差特征过滤

删除低方差的一些特征

类:sklearn.feature_selection.VarianceThreshold(threshold = 0.0)

删除所有的低方差特征

方法:

  • fit_transform(X):

X:numpy数组

返回值:训练集差异低于threshold的特征将会被删除,默认是保持所有的特征,即方差非零特征,即删除所有样本中具有相同值的特征。

import sklearn.datasets as datasets
from sklearn.feature_selection import VarianceThreshold
iris=datasets.load_iris()
def low_std():
select=VarianceThreshold(threshold=0.5)
new_data = select.fit_transform(iris.data)
print(new_data)

相关系数

皮尔逊相关系数

  1. 公式

$$r= cov(X, Y) / (σ(X) * σ(Y))=\frac{\sum((X_i - \bar{X}) * (Y_i - \bar{Y}))}{\sqrt{\sum(X_i - \bar{X})^2 * \sum(Y_i - \bar{Y})^2}}$$

  1. 特点
  • r>0,正相关,r<0,负相关,|r|<=1
  • r=1时,两个变量完全相关,r=0时,两变量无相关关系
  • |r|<0.4为低相关度,0.4<=|r|<0.7为显著性相关,|r|>=0.7为高度线性相关

scipy.stats.pearsonr(x,y)

X,Y为数组

返回值中的statistic属性为相关系数,pvalue属性为p 值(表示观察到的统计量在零假设成立的情况下(即两个变量之间没有线性关系)出现的概率)

r=pearsonr(iris.data[:,0],iris.data[:,1])
print(r)

主成分分析

(PCA)

  1. 定义:高维度数据转化为低维度数据的过程,在此过程中可能会舍弃原有数据,创建新的变量

  2. 作用:是数据维数压缩,尽可能降低原数据的维度(复杂度),损失少量信息

  3. 应用:回归分析或者聚类分析当中

sklearn.decomposition.PCA(n_components=None)

  • 将数据分解为较低维数空间
  • n_components
    • float数据:表示保留百分比
    • int数据:减少到多少特征

fit_transform(X)