【机器学习】(三)——简单的数据预处理和特征工程

本文详细介绍了数据预处理的关键步骤,包括数据归一化、缺失值处理、分类型特征编码和连续性特征处理。探讨了最值归一化、均值方差归一化、缺失值填补策略、特征编码方法及连续变量的二值化和分段技术。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

学习目标

1、无量纲化:最值归一化、均值方差归一化及sklearn中的Scaler

2、缺失值处理

3、处理分类型特征:编码与哑变量

4、处理连续性特征:二值化与分段

知识整理

【1】

  数据归一化/标准化(normalization),是将数据按比例缩放,使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。

  在实际应用中,样本的不同特征的单位不同,会在求距离时造成很大的影响。比如:在两个样本中肿瘤大小的分别为1cm和5cm,发现时间分别为100天和200天,那么在求距离时,时间差为100、大小差为4,那么其结果会被时间所主导,因为肿瘤大小的差距太小了。但是如果我们把时间用年做单位,0.27年与0.55年的差距又远小于肿瘤大小的差距,结果又会被大小主导了

  在量纲不同的情况下,以上的情况,不能反映样本中每一个特征的重要程度。一般来说,我们的解决方案是:把所有的数据都映射到同一个尺度(量纲)上

  ==>这就需要数据归一化了,而常用的归一化有两种(最值归一化均值方差归一化

最值归一化(normalization):把所有数据映射到0-1之间。最值归一化的使用范围是特征的分布具有明显边界的(分数0~100分、灰度0~255),受outlier的影响比较大

                                                                         x_{scale}=\frac{x-x_{min}}{x_{max}-x_{min}}

  代码实现:

# 创建100个数据,进行最值归一化实现

import numpy as np

# 创建100个随机数
x = np.random.randint(0,100,size=100)

# 最值归一化(向量)
# 最值归一化公式,映射到0,1之间
(x - np.min(x)) / (np.max(x) - np.min(x))

# 最值归一化(矩阵)
# 0~100范围内的50*2的矩阵
X = np.random.randint(0,100,(50,2))

# 将矩阵改为浮点型
X = np.array(X,dtype=float)

# 最值归一化公式,对于每一个维度(列方向)进行归一化
# X[:,0]第一列,第一个特征
X[:,0] = (X[:,0] - np.min(X[:,0])) / (np.max(X[:,0]) - np.min(X[:,0]))

# X[:,1]第二列,第二个特征
X[:,1] = (X[:,1] - np.min(X[:,1])) / (np.max(X[:,1]) - np.min(X[:,1]))

# 如果有n个特征,可以写个循环
for i in range(0,2):
    X[:,i] = (X[:,i]-np.min(X[:,i])) / (np.max(X[:,i] - np.min(X[:,i])))

# 绘制样本
import matplotlib.pyplot as plt
# 简单绘制样本,看横纵坐标
plt.scatter(X[:,0],X[:,1])
plt.show()

                                  

均值方差归一化(standardization):把所有数据归一到均值为0方差为1的分布中。适用于数据中没有明显的边界,有可能存在极端数据值的情况

                                                                          x_{scale}=\frac{x-x_{mean}}{S}

x_{mean}:特征均值,S:特征方差

该种归一化方式要求原始数据的分布可以近似为高斯分布,否则归一化的效果会变得很糟糕

  代码实现:

# 创建100个数据,进行均值方差归一化实现
# 使用np.mean()/np.std()来计算其均值和方差

import numpy as np

X = np.array(np.random.randint(0,100,(50,2)),dtype=float)

# 套用公式,对每一列做均值方差归一化
for i in range(0,2):
    X[:,i]=(X[:,i]-np.mean(X[:,i])) / np.std(X[:,i])

import matplotlib.pyplot as plt
# 简单绘制样本,看横纵坐标
plt.scatter(X[:,0],X[:,1])
plt.show()

                                   

  我们在建模时要将数据集划分为训练数据集&测试数据集。

  训练数据集进行归一化处理,需要计算出训练数据集的均值mean_train和方差std_train。

  问题是:我们在对测试数据集进行归一化时,要计算测试数据的均值和方差么?

  答案是否定的。在对测试数据集进行归一化时,仍然要使用训练数据集的均值train_mean和方差std_train。这是因为测试数据是模拟的真实环境,真实环境中可能无法得到均值和方差,对数据进行归一化。因此我们要保存训练数据集中得到的均值和方差

sklearn中的Scaler

  以鸢尾花数据集为例:

from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
X = iris.data
y = iris.target
X_train,X_test,y_train,y_test = train_test_split(iris.data,iris.target,test_size=0.2,random_state=666)

# 数据归一化
from sklearn.preprocessing import StandardScaler
standardScaler = StandardScaler()
# 归一化的过程跟训练模型一样
standardScaler.fit(X_train)
print(standardScaler.mean_)
print(standardScaler.scale_)   # 表述数据分布范围的变量,替代std_

# 使用transform,得到归一化数据
X_train_standard = standardScaler.transform(X_train)
X_test_standard = standardScaler.transform(X_test)

【2】

缺失值产生原因

1.数据提取(Data Extraction)

  提取过程可能有问题,在这种情况下,应该使用数据监护检查数据的准确性, 一些散列程序也可以用来确保数据提取的正确性,比较容易纠正(数据提取主要在NLP或者图像邻域,我现在理解不到位,后面补充)。

2.数据采集(Data collection)

  数据采集时发生的错误,很难纠正,主要分为以下四种:

  • Missing completely at random
    即所有观测值的缺失变量的概率相同。 例如:数据收集过程的受访者决定在抛出一个硬币后,宣布他们的收入。 如果发生,受访者宣布他的收入,反之亦然,这样,每个观察值,具有相同概率的缺失值。

  • Missing at random
    即随机丢失变量概率,因其他输入变量的不同值或类别而变化。 例如:我们收集年龄,女性相比男性,具有较高的缺失值。

  • 缺失值依赖于不可观察的预测变量
    即缺失值不是随机的并且与未查看的输入变量相关。 例如:在一项医学研究中,如果特定诊断导致不适,那么研究中有更多的辍学机会。 这个缺失值不是随机的,除非我们将“不适”作为所有患者的输入变量。

  • 缺失取决于缺失值本身
    即缺失值的概率与缺失值本身直接相关。 例如:拥有较高或较低收入的人士,可能让其提供收入证明,有些不愿意。

缺失值为什么要处理

  训练数据集中缺少的数据可以减少模型的拟合,或者可能导致模型偏差,因为没有正确地分析变量的行为和关系,可能导致错误的预测或分类。

缺失值处理办法

1. 删除
  主要有简单删除法和权重法。简单删除法是对缺失值进行处理的最原始方法。

(1) 简单删除法
  此方法将存在缺失值的数据条目(对象,元组,记录)进行删除。这种方法简单易行,在对象有多个属性缺失值、被删除的含缺失值的对象与信息表中的数据量相比非常小的情况下是非常有效的。然而,这种方法却有很大的局限性。它是以减少历史数据来换取信息的完备,会造成资源的大量浪费,丢弃了大量隐藏在这些对象中的信息。在信息表中本来包含的对象很少的情况下,删除少量对象就足以严重影响到信息表信息的客观性和结果的正确性;当每个属性空值的百分比变化很大时,它的性能非常差。

(2) 权重法
  当缺失值的类型为非完全随机缺失的时候,可以通过对完整的数据加权来减小偏差。把数据不完全的个案标记后,将完整的数据个案赋予不同的权重,个案的权重可以通过logistic或probit回归求得。如果解释变量中存在对权重估计起决定行因素的变量,那么这种方法可以有效减小偏差。如果解释变量和权重并不相关,它并不能减小偏差。对于存在多个属性缺失的情况,就需要对不同属性的缺失组合赋不同的权重,这将大大增加计算的难度,降低预测的准确性,这时权重法并不理想。

2. 填补
  这类方法是用一定的值去填充空值,从而使信息表完备化。通常基于统计学原理,根据决策表中其余对象取值的分布情况来对一个空值进行填充,譬如用其余属性的平均值来进行补充等。数据挖掘中常用的有以下几种补齐方法:

(1) 人工填写(filling manually)
  由于最了解数据的还是用户自己,因此这个方法产生数据偏离最小,可能是填充效果最好的一种。然而一般来说,该方法很费时,当数据规模很大、空值很多的时候,该方法是不可行的。

(2) 特殊值填充(Treating Missing Attribute values as Special values)
  将空值作为一种特殊的属性值来处理,它不同于其他的任何属性值。如所有的空值都用“unknown”填充。这样将形成另一个有趣的概念,可能导致严重的数据偏离,一般不推荐使用。

(3) 均值填充(Mean/Mode Completer)
  将信息表中的属性分为数值属性和非数值属性来分别进行处理。如果空值是数值型的,就根据该属性在其他所有对象的取值的平均值来填充该缺失的属性值;如果空值是非数值型的,就根据统计学中的众数原理,用该属性在其他所有对象的取值次数最多的值(即出现频率最高的值)来补齐该缺失的属性值。另外有一种与其相似的方法叫条件平均值填充法(Conditional Mean Completer)。在该方法中,缺失属性值的补齐同样是靠该属性在其他对象中的取值求平均得到,但不同的是用于求平均的值并不是从信息表所有对象中取,而是从与该对象具有相同决策属性值的对象中取得。这两种数据的补齐方法,其基本的出发点都是一样的,以最大概率可能的取值来补充缺失的属性值,只是在具体方法上有一点不同。与其他方法相比,它是用现存数据的多数信息来推测缺失值。

impute.SimpleImputer类:提供了估算缺失值的基本策略。缺失的值可以用提供的常量值来计算, 或使用缺失值所在的每一列的统计数据(平均值、中位数或最频繁)。该类还允许不同的缺失值编码。

class sklearn.impute.SimpleImputer(missing_values=nan, strategy=’mean’, fill_value=None, verbose=0, copy=True)

# missing_values : 告诉SimpleImputer,数据中的缺失值长什么样,默认空值np.nan
# strategy : 我们填补缺失值的策略,默认均值
#             输入“mean”使用均值填补(仅对数值型特征可用)
#             输入“median"用中值填补(仅对数值型特征可用)
#             输入"most_frequent”用众数填补(对数值型和字符型特征都可用)
#             输入“constant"表示请参考参数“fill_value"中的值(对数值型和字符型特征都可用)
# fill_value : 当参数startegy为”constant"的时候可用,可输入字符串或数字表示要填充的值,常用0
# copy : 默认为True,将创建特征矩阵的副本,反之则会将缺失值填补到原本的特征矩阵中去。

  使用Pandas和Numpy进行填补:

import pandas as pd
data = pd.read_csv(r"C:\work\learnbetter\micro-class\week 3 Preprocessing\Narrativedata.csv",index_col=0)
​
data.head()
​
# .fillna 在DataFrame里面直接进行填补
data.loc[:,"Age"] = data.loc[:,"Age"].fillna(data.loc[:,"Age"].median())
​
# .dropna(axis=0)删除所有有缺失值的行,.dropna(axis=1)删除所有有缺失值的列
# 参数inplace,为True表示在原数据集上进行修改,为False表示生成一个复制对象,不修改原数据,默认False
data.dropna(axis=0,inplace=True)

(4) 热卡填充(Hot deck imputation,或就近补齐)
  对于一个包含空值的对象,热卡填充法在完整数据中找到一个与它最相似的对象,然后用这个相似对象的值来进行填充。不同的问题可能会选用不同的标准来对相似进行判定。该方法概念上很简单,且利用了数据间的关系来进行空值估计。这个方法的缺点在于难以定义相似标准,主观因素较多。

(5) 聚类填充(clustering imputation)
  最为典型的代表是K最近距离邻法(K-means clustering),先根据欧式距离或相关分析来确定距离具有缺失数据样本最近的K个样本,将这K个值加权平均来估计该样本的缺失数据。同均值插补的方法都属于单值插补,不同的是,它用层次聚类模型预测缺失变量的类型,再以该类型的均值插补。假设X=(X1,X2…Xp)为信息完全的变量,Y为存在缺失值的变量,那么首先对X或其子集行聚类,然后按缺失个案所属类来插补不同类的均值。如果在以后统计分析中还需以引入的解释变量和Y做分析,那么这种插补方法将在模型中引入自相关,给分析造成障碍。

(6) 使用所有可能的值填充(Assigning All Possible values of the Attribute)
  这种方法是用空缺属性值的所有可能的属性取值来填充,能够得到较好的补齐效果。但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大,可能的测试方案很多。另有一种方法,填补遗漏属性值的原则是一样的,不同的只是从决策相同的对象中尝试所有的属性值的可能情况,而不是根据信息表中所有对象进行尝试,这样能够在一定程度上减小原方法的代价。

(7) 组合完整化方法(Combinatorial Completer)
  这种方法是用空缺属性值的所有可能的属性取值来试,并从最终属性的约简结果中选择最好的一个作为填补的属性值。这是以约简为目的的数据补齐方法,能够得到好的约简结果;但是,当数据量很大或者遗漏的属性值较多时,其计算的代价很大。另一种称为条件组合完整化方法(Conditional Combinatorial Complete),填补遗漏属性值的原则是一样的,不同的只是从决策相同的对象中尝试所有的属性值的可能情况,而不是根据信息表中所有对象进行尝试。条件组合完整化方法能够在一定程度上减小组合完整化方法的代价。在信息表包含不完整数据较多的情况下,可能的测试方案将巨增。

(8) 回归(Regression)
  基于完整的数据集,建立回归方程(模型)。对于包含空值的对象,将已知属性值代入方程来估计未知属性值,以此估计值来进行填充。当变量不是线性相关或预测变量高度相关时会导致有偏差的估计。

(9) 极大似然估计(Max Likelihood ,ML)
  在缺失类型为随机缺失的条件下,假设模型对于完整的样本是正确的,那么通过观测数据的边际分布可以对未知参数进行极大似然估计(Little and Rubin)。这种方法也被称为忽略缺失值的极大似然估计,对于极大似然的参数估计实际中常采用的计算方法是期望值最大化(Expectation Maximization,EM)。该方法比删除个案和单值插补更有吸引力,它一个重要前提:适用于大样本。有效样本的数量足够以保证ML估计值是渐近无偏的并服从正态分布。但是这种方法可能会陷入局部极值,收敛速度也不是很快,并且计算很复杂。

(10) 多重插补(Multiple Imputation,MI)
  多值插补的思想来源于贝叶斯估计,认为待插补的值是随机的,它的值来自于已观测到的值。具体实践上通常是估计出待插补的值,然后再加上不同的噪声,形成多组可选插补值。根据某种选择依据,选取最合适的插补值。多重插补方法分为三个步骤:①为每个空值产生一套可能的插补值,这些值反映了无响应模型的不确定性;每个值都可以被用来插补数据集中的缺失值,产生若干个完整数据集合。②每个插补数据集合都用针对完整数据集的统计方法进行统计分析。③对来自各个插补数据集的结果,根据评分函数进行选择,产生最终的插补值。 
多重插补和贝叶斯估计的思想是一致的,但是多重插补弥补了贝叶斯估计的几个不足。第一,贝叶斯估计以极大似然的方法估计,极大似然的方法要求模型的形式必须准确,如果参数形式不正确,将得到错误得结论,即先验分布将影响后验分布的准确性。而多重插补所依据的是大样本渐近完整的数据的理论,在数据挖掘中的数据量都很大,先验分布将极小的影响结果,所以先验分布的对结果的影响不大。第二,贝叶斯估计仅要求知道未知参数的先验分布,没有利用与参数的关系。而多重插补对参数的联合分布作出了估计,利用了参数间的相互关系。 
同时,多重插补保持了单一插补的两个基本优点,即应用完全数据分析方法和融合数据收集者知识的能力。相对于单一插补,多重插补有三个极其重要的优点:第一,为表现数据分布,随机抽取进行插补,增加了估计的有效性。第二,当多重插补是在某个模型下的随机抽样时,按一种直接方式简单融合完全数据推断得出有效推断,即它反映了在该模型下由缺失值导致的附加变异。第三,在多个模型下通过随机抽取进行插补,简单地应用完全数据方法,可以对无回答的不同模型下推断的敏感性进行直接研究。 
多重插补也有以下缺点:①生成多重插补比单一插补需要更多工作;②贮存多重插补数据集需要更多存储空间;③分析多重插补数据集比单一插补需要花费更多精力。

3. 不处理
  直接在包含空值的数据上进行数据挖掘。这类方法包括贝叶斯网络和人工神经网络等。 
  贝叶斯网络是用来表示变量间连接概率的图形模式,它提供了一种自然的表示因果信息的方法,用来发现数据间的潜在关系。在这个网络中,用节点表示变量,有向边表示变量间的依赖关系。贝叶斯网络仅适合于对领域知识具有一定了解的情况,至少对变量间的依赖关系较清楚的情况。否则直接从数据中学习贝叶斯网的结构不但复杂性较高(随着变量的增加,指数级增加),网络维护代价昂贵,而且它的估计参数较多,为系统带来了高方差,影响了它的预测精度。当在任何一个对象中的缺失值数量很大时,存在指数爆炸的危险。 
  人工神经网络可以有效的对付空值,但人工神经网络在这方面的研究还有待进一步深入展开。人工神经网络方法在数据挖掘应用中的局限性

【3】

  在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和普斯贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是["小学",“初中”,“高中”,"大学"],付费方式可能包含["支付宝",“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型

标签转数值

# preprocessing.LabelEncoder:标签专用,能够将分类转换为分类数值
# LabelEncoder可以将标签分配一个0—n_classes-1之间的编码

from sklearn.preprocessing import LabelEncoder
import pandas as pd

data = pd.DataFrame({'A':[1,2,3],
                     'B':[4,5,6],
                     'C':[7,8,9],
                     'D':[1,3,5],
                     'E':[5,3,6],
                     'F':[7,4,3]})

# 要输入的是标签,不是特征矩阵,所以允许一维
y = data.iloc[:,-1]

# 实例化
le = LabelEncoder()

# 导入数据
le = le.fit(y)
# transform接口调取结果
label = le.transform(y)

# 属性.classes_查看标签中究竟有多少类别
print("le.classes_ = ", le.classes_)
# 查看获取的结果label
print("label = ", label)

# 也可以直接fit_transform一步到位
le.fit_transform(y)

# 使用inverse_transform可以逆转
le.inverse_transform(label)

# 让标签等于我们运行出来的结果
data.iloc[:,-1] = label

data.head()

# 如果不需要教学展示的话我会这么写:
from sklearn.preprocessing import LabelEncoder
data.iloc[:,-1] = LabelEncoder().fit_transform(data.iloc[:,-1])

特征转数值:(代码要求scikit-learn>=0.20)

# preprocessing.OrdinalEncoder:特征专用,能够将分类特征转换为分类数值
# LabelEncoder可以将标签分配一个0—n_classes-1之间的编码

from sklearn.preprocessing import OrdinalEncoder
import pandas as pd

data = pd.DataFrame({'A':[1,2,3],
                     'B':[4,5,6],
                     'C':[7,8,9],
                     'D':[1,3,5],
                     'E':[5,3,6],
                     'F':[7,4,3]})

# 接口categories_对应LabelEncoder的接口classes_,一模一样的功能
data_ = data.copy()

print(data_.head())

OrdinalEncoder().fit(data_.iloc[:,1:-1]).categories_

data_.iloc[:,1:-1] = OrdinalEncoder().fit_transform(data_.iloc[:,1:-1])

print(data_.head())

哑变量

我们来思考三种不同性质的分类数据:

  1)舱门(S,C,Q)

       三种取值S,C,Q是相互独立的,彼此之间完全没有联系,表达的是S≠C≠Q的概念。这是名义变量。

  2)学历(小学,初中,高中)

     三种取值不是完全独立的,我们可以明显看出,在性质上可以有高中>初中>小学这样的联系,学历有高低,但是学历取值之间却不是可以计算的,我们不能说小学 + 某个取值 = 初中。这是有序变量。

  3)体重(>45kg,>90kg,>135kg)

  各个取值之间有联系,且是可以互相计算的,比如120kg - 45kg = 90kg,分类之间可以通过数学计算互相转换。这是有距变量。

  然而在对特征进行编码的时候,这三种分类数据都会被我们转换为[0,1,2],这三个数字在算法看来,是连续且可以计算的,这三个数字相互不等,有大小,并且有着可以相加相乘的联系。所以算法会把舱门,学历这样的分类特征,都误会成是体重这样的分类特征。这是说,我们把分类转换成数字的时候,忽略了数字中自带的数学性质,所以给算法传达了一些不准确的信息,而这会影响我们的建模。

  类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量向算法传达最准确的信息:

  这样的变化,让算法能够彻底领悟,原来三个取值是没有可计算性质的,是“有你就没有我”的不等概念。在我们的数据中,性别和舱门,都是这样的名义变量。因此我们需要使用独热编码,将两个特征都转换为哑变量。

from sklearn.preprocessing import OneHotEncoder
import pandas as pd

data = pd.DataFrame({'A':[1,2,3],
                     'B':[4,5,6],
                     'C':[7,8,9],
                     'D':[1,3,5],
                     'E':[5,3,6],
                     'F':[7,4,3]})


print("data.head() = \n", data.head())

X = data.iloc[:,1:-1]

enc = OneHotEncoder(categories='auto').fit(X)
result = enc.transform(X).toarray()
print("result = \n", result)

# 依然可以直接一步到位,但为了给大家展示模型属性,所以还是写成了三步
OneHotEncoder(categories='auto').fit_transform(X).toarray()

# 依然可以还原
pd.DataFrame(enc.inverse_transform(result))

enc.get_feature_names()

print("result = \n", result)
print("result.shape = ", result.shape)

# axis=1,表示跨行进行合并,也就是将量表左右相连,如果是axis=0,就是将量表上下相连
newdata = pd.concat([data,pd.DataFrame(result)],axis=1)

print("newdata.head() =\n", newdata.head())

【4】

Binarizer类

  根据阈值将数据二值化(将特征值设置为0或1),用于处理连续型变量

  大于阈值的值映射为1,而小于或等于阈值的值映射为0

  默认阈值为0时,特征中所有的正值都映射到1

  二值化是对文本计数数据的常见操作,分析人员可以决定仅考虑某种现象的存在与否;它还可以用作考虑布尔随机变量的估计器的预处理步骤(例如,使用贝叶斯设置中的伯努利分布建模)。

#导二值化包(特征专用)
from sklearn.preprocessing import Binarizer
import pandas as pd

data = pd.DataFrame({"Age":[22.0, 38.0, 26.0, 35.0, 35.0],
                     "Sex":['male', 'female', 'female', 'female', 'male']})

# 提取年龄,要.reshape(-1,1)变为一列
data_2 = data.copy()
X = data_2.iloc[:,0].values.reshape(-1,1)

# 将年龄二值化
# threshold = 30是阈值,大于30为1,小于30为0
transformer = Binarizer(threshold=30).fit_transform(X)
print(transformer)

KBinsDiscretizer类:将连续型变量划分为分类变量的类,能够将连续型变量排序后按顺序分箱后编码

# n_bins : 每个特征中分箱的个数,默认5,一次会被运用到所有导入的特征
# encode : 编码的方式,默认“onehot”
#          "onehot":做哑变量,之后返回一个稀疏矩阵,每一列是一个特征中的一个类别,含有该类别的样本表示为1,不含的表示为0
#          "ordinal":每个特征的每个箱都被编码为一个整数,返回每一列是一个特征,每个特征下含 有不同整数编码的箱的矩阵
#          "onehot-dense":做哑变量,之后返回一个密集数组。
# strategy : 用来定义箱宽的方式,默认"quantile" 
#            "uniform":表示等宽分箱,即每个特征中的每个箱的最大值之间的差为 (特征.max() - 特征.min())/(n_bins) 
#            "quantile":表示等位分箱,即每个特征中的每个箱内的样本数量都相同 
#            "kmeans":表示按聚类分箱,每个箱中的值到最近的一维k均值聚类的簇心得距离都相同

from sklearn.preprocessing import KBinsDiscretizer
import pandas as pd

data = pd.DataFrame({"Age":[22.0, 38.0, 26.0, 35.0, 35.0],
                     "Sex":['male', 'female', 'female', 'female', 'male']})

X = data.iloc[:,0].values.reshape(-1,1)
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
print(est.fit_transform(X))

# 查看转换后分的箱:变成了一列中的三箱
set(est.fit_transform(X).ravel())

est = KBinsDiscretizer(n_bins=3, encode='onehot', strategy='uniform')
# 查看转换后分的箱:变成了哑变量
print(est.fit_transform(X).toarray())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值