目录
数据分箱就是将连续变量离散化。
bagging&boosting
onehot独热编码
独热编码的结果如下:
woe编码
WOE编码的基本原理
步骤一:计算WOE
步骤二:应用WOE
WOE编码的优点
示例
数据示例
步骤一:计算每个类别的违约率
步骤二:计算WOE值
步骤三:应用WOE编码
模块介绍:万能的ensemble(集成学习)
数据分箱就是将连续变量离散化。
数据分箱(Data Binning)是一种常见的数据预处理技术,它将连续的数据值重新划分为几个“箱子”或区间,从而将连续变量转换为有序的分类变量。这种技术在数据分析和机器学习中非常有用,因为它可以帮助简化数据、减少噪声影响、提高模型训练效率,并且可以使某些类型的分析和建模变得更加容易
数据分箱(Data Binning)是一种数据预处理技术,它涉及将一组数据值分配到几个连续的区间(箱子)中。这个过程通常用于以下几种情况:
-
数据简化:通过将大量的数据点分组到较少的箱子中,可以简化数据集,使得数据更加容易理解和分析。
-
异常值处理:分箱可以帮助识别和处理异常值,例如,可以将超出正常范围的值归入一个单独的箱子。
-
平滑数据:分箱可以用来平滑数据,减少噪声的影响,特别是在数据挖掘和机器学习中。
-
数据离散化:对于某些算法,特别是决策树和规则学习算法,分箱可以将连续变量转换为离散变量,从而更适合算法的应用。
数据分箱的步骤通常包括:
- 确定箱子的数量:这可以通过主观判断,或者使用一些统计方法,如等宽分箱、等频分箱或基于聚类的方法来决定。
- 分配数据到箱子:根据确定的箱子边界,将数据点分配到相应的箱子中。
- 处理边界值:确定如何处理那些落在箱子边界上的数据点,通常可以选择向上或向下分配。
数据分箱后的箱子可以用箱子的中值、平均值、边界值或其它统计量来代表箱子内的所有数据点,这取决于具体的应用场景和分析目的。在实施数据分箱时,需要谨慎考虑分箱策略,因为不恰当的分箱可能会导致信息的丢失或引入偏差。
import pandas as pd
# 客户信息 DataFrame
customers_df = pd.DataFrame({
'CustomerID': [1, 2, 3, 4],
'CustomerName': ['Alice', 'Bob', 'Charlie', 'David'],
'Time':[10,20,30,40]
})
# 订单信息 DataFrame
orders_df = pd.DataFrame({
'OrderID': [100, 101, 102, 103],
'CustomerID': [1, 2, 3, 5],
'OrderAmount': [200, 150, 300, 250],
'Time':[10,20,30,80]
})
display(customers_df)
display(orders_df)
pd.merge(customers_df,orders_df,
on=["CustomerID","Time"]#这里on=列名组成的列表,但只能是二者共有的列名
#on表示在这些列使用连接
,how='right')#这里how表示取右侧的行。右侧customerID为1235,
#所以合并后的customerID只有1235,没有左边列表的ID4
orders_df = pd.DataFrame({
'OrderID': [100, 101, 102, 103],
'CustomerID': [1, 2, 3, 5],
'OrderAmount': [200, 150, 300, 250],
'Time':[10,20,30,80]
})
data_cut=pd.cut(orders_df['OrderAmount'],100)
data_cut
pd.cut(待分享的pd【指定索引】,分成多少个箱子)
返回值个数=样本个数,即某样本属于哪个箱子
bagging&boosting
随机森林模型是Bagging算法的一个代表,而AdaBoost和GBDT(Gradient Boosting Decision Tree,梯度提升决策树)是Boosting算法的代表。
Bagging(Bootstrap Aggregating)算法:
Bagging是一种集成学习技术,它通过结合多个模型来提高预测的稳定性和准确性。以下是Bagging的主要步骤:
- 数据采样:从原始数据集中进行有放回的随机抽样,生成多个不同的训练子集。
- 模型训练:使用这些子集分别训练多个独立的模型(例如决策树)。
- 结果聚合:对于分类问题,通常采用投票机制来决定最终的类别;对于回归问题,则采用平均或中位数来聚合模型的预测结果。
Bagging的关键特点是每个模型都是在不同的数据子集上训练的,这有助于减少模型的方差,避免过拟合。
Boosting算法:
Boosting是一种逐步增强模型预测力的策略,通过连续地训练模型来关注前一个模型错误分类或预测的样本。以下是Boosting的主要步骤:
- 初始化模型:通常从一个简单的模型开始,这个模型对训练数据的预测能力很弱。
- 迭代训练:在每一轮迭代中,都会训练一个新的模型,这个模型会特别关注前一个模型预测错误的样本。
- 模型组合:每个模型都会根据自己的预测能力赋予一个权重,所有模型的加权预测结果将作为最终的预测。
Boosting的关键特点是模型是顺序训练的,每个新模型都在尝试纠正前一个模型的错误,这有助于减少模型的偏差。
总结:
- Bagging:并行化处理,每个模型独立训练,最后汇总结果,主要目的是减少方差。
- Boosting:顺序化处理,每个模型基于前一个模型的性能进行训练,逐步提高性能,主要目的是减少偏差。
这两种集成学习方法在机器学习中都非常流行,它们可以应用于各种不同的机器学习任务,并且通常能够提供比单个模型更好的性能。
onehot独热编码
这段代码使用了scikit-learn库中的OneHotEncoder类来进行独热编码。
-
from sklearn.preprocessing import OneHotEncoder
这一行导入了scikit-learn库中的预处理模块,并从中导入OneHotEncoder类。OneHotEncoder用于将分类特征转换为二进制编码形式。 -
enc = OneHotEncoder()
这一行创建了OneHotEncoder类的实例,并将其赋值给变量enc
。这样就可以使用该实例对数据进行独热编码了。 -
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
这一行调用了enc
对象的fit
方法,并传入了一个包含多个列表的列表作为参数。这些列表代表了要被独热编码的特征值。fit
方法会根据这些特征值来确定哪些类别需要进行编码。 -
enc.transform([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]).toarray()
这一行调用了enc
对象的transform
方法,并传入了一个与上一行相同的列表作为参数。transform
方法会对传入的列表进行独热编码,并将其转换为NumPy数组格式。最后,.toarray()
方法将转换后的结果强制转换为NumPy数组类型。
综上所述,这段代码的主要作用是对给定的特征值进行独热编码,并将其转换为NumPy数组格式。
独热编码的结果如下:
[[1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0],
[0.0, 1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0],
[1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0],
[0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0]]
这个结果是通过以下步骤计算得出的:
-
独热编码器拟合数据:
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
。这一步确定了每个特征的类别数量。在这个例子中,有三个特征,每个特征的类别数量分别是:第一个特征有2个类别(0和1),第二个特征也是2个类别(0和1),第三个特征有3个类别(0, 1, 和 2)。 -
转换数据:
enc.transform([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
。这一步将原始数据转换为独热编码格式。 -
转换结果:
.toarray()
将结果转换为NumPy数组。
每个特征的独热编码如下:
- 第一个特征(0和1)有两个类别,所以需要2位来表示。
- 第二个特征(0和1,2)同样有3个类别,也需要3位来表示。
- 第三个特征(0, 1, 2,3)有4个类别,所以需要4位来表示。
因此,每个样本(原始数据中的一个列表)将被转换为一个长度为2 + 3 + 4 = 9的向量。但为什么结果是9位呢?这是因为独热编码器默认会添加一个偏置列(即第一个列),以确保每个样本至少有一个特征为1,从而避免数据稀疏性带来的问题。所以,最终每个样本的独热编码向量长度为8位(7位特征 + 1位偏置)。
看点在这里
第三个特征出现了3、0、1、1,被认为只需要三位,所以不是找最大的 者、
woe编码
WOE编码(Weight of Evidence Encoding)是一种用于分类变量编码的方法,主要用于机器学习中的特征工程阶段。它通过计算每个类别的权重证据(WOE)来对类别进行编码,而不是简单地使用标签编码或独热编码。这种方法能够保留原类别信息的同时,也考虑到了不同类别之间的相关性。
WOE编码的基本原理
步骤一:计算WOE
对于每一个类别 �c,我们首先计算它的WOE值。WOE值的计算公式如下:
其中:
- �(�)P(c) 是类别 �c 的先验概率,即该类别出现的频率。
- �(good)P(good) 是“好”类的先验概率,通常指目标变量的正例比例。
步骤二:应用WOE
一旦计算出所有类别的WOE值,就可以将这些值作为新的特征加入到模型中进行训练。
WOE编码的优点
- 数值稳定性:由于WOE是基于对数变换的,它可以处理不平衡的数据分布,并且比直接使用类别标签更加稳定。
- 可解释性:WOE保留了原始类别信息的含义,使得模型更容易理解和解释。
- 减少维度:相比于独热编码,WOE可以显著降低特征空间的维度,因为它不需要为每个类别创建一个新的特征。
示例
假设我们有如下的数据集:
类别 | 目标变量 |
---|---|
A | 1 |
B | 0 |
C | 1 |
D | 0 |
我们可以按照上述步骤计算每个类别的WOE值,然后将其应用到我们的模型中。
请注意,WOE编码通常用于信用评分、欺诈检测等金融领域,在这些领域中,我们需要有效地处理大量的分类变量。
WOE(Weight of Evidence)编码通常用于金融风险模型,特别是在信用评分模型中。以下是一个简化的例子,说明如何计算WOE值并将其应用于数据。
数据示例
假设我们有一个关于贷款申请的数据集,包含两个特征:Education
(教育程度)和Loan Default
(是否违约)。Loan Default
是目标变量,取值为1(违约)或0(未违约)。
Education | Loan Default |
---|---|
Bachelor | 0 |
Master | 0 |
PhD | 1 |
Bachelor | 0 |
Master | 1 |
Bachelor | 1 |
… | … |
步骤一:计算每个类别的违约率
首先,我们需要计算每个教育类别的违约率(违约客户数/该类别总客户数)和非违约率。
Education | Default Count | Total Count | Default Rate | Non-Default Rate |
---|---|---|---|---|
Bachelor | 20 | 100 | 0.20 | 0.80 |
Master | 15 | 150 | 0.10 | 0.90 |
PhD | 5 | 50 | 0.10 | 0.90 |
步骤二:计算WOE值
WOE值的计算公式是
假设整个数据集的违约率是0.15,非违约率是0.85,我们可以计算每个教育类别的WOE值:
Education | Default Rate | Non-Default Rate | WOE |
---|---|---|---|
Bachelor | 0.20 | 0.80 | 0.4055 |
Master | 0.10 | 0.90 | -0.5108 |
PhD | 0.10 | 0.90 | -0.5108 |
步骤三:应用WOE编码
现在,我们可以用计算出的WOE值替换原始的Education
类别。
Education | Loan Default | WOE (Education) |
---|---|---|
Bachelor | 0 | 0.4055 |
Master | 0 | -0.5108 |
PhD | 1 | -0.5108 |
Bachelor | 0 | 0.4055 |
Master | 1 | -0.5108 |
Bachelor | 1 | 0.4055 |
… | … | … |
这样,原始的类别变量Education
就被转换成了数值变量WOE (Education)
,可以用于建模。WOE编码有助于模型更好地理解每个类别与目标变量的关系。
具体列式
根据你给出的数据,我们可以计算出每个教育类别的WOE值。以下是计算过程:
Bachelor
- 违约率:0.20
- 整体违约率:0.15
- 非违约率:0.85
- WOE = log(0.20 / 0.15) - log(0.80 / 0.85)
Master
- 违约率:0.10
- 整体违约率:0.15
- 非违约率:0.85
- WOE = log(0.10 / 0.15) - log(0.90 / 0.85)
PhD
- 违约率:0.10
- 整体违约率:0.15
- 非违约率:0.85
- WOE = log(0.10 / 0.15) - log(0.90 / 0.85)
将这些值代入公式中,我们可以得到每个教育类别的WOE值。
模块介绍:万能的ensemble(集成学习)
在scikit-learn(通常简称为sklearn)库中,ensemble
模块是一个提供集成学习方法的模块。集成学习方法通过结合多个基学习器(通常是决策树)来构建更加强大和鲁棒的模型。这个模块包含了多种流行的集成学习算法,如下:
-
Bagging方法:
BaggingClassifier
: 用于分类的Bagging集成。BaggingRegressor
: 用于回归的Bagging集成。
-
随机森林:
RandomForestClassifier
: 用于分类的随机森林算法。RandomForestRegressor
: 用于回归的随机森林算法。
-
Extra-Trees:
ExtraTreesClassifier
: 用于分类的Extra-Trees(极度随机树)算法。ExtraTreesRegressor
: 用于回归的Extra-Trees算法。
-
AdaBoost:
AdaBoostClassifier
: 用于分类的AdaBoost算法。AdaBoostRegressor
: 用于回归的AdaBoost算法。
-
梯度提升:
GradientBoostingClassifier
: 用于分类的梯度提升决策树(GBDT)算法。GradientBoostingRegressor
: 用于回归的梯度提升决策树算法。
-
VotingClassifier: 用于分类的投票/堆叠集成,可以组合多个不同的分类器。
-
StackingClassifier
和
StackingRegressor`: 用于分类和回归的堆叠集成,通过堆叠多个不同的模型来提高性能。
ensemble
模块中的这些类都是高级API,它们封装了复杂的集成学习过程,使得用户可以很容易地在自己的数据集上应用这些强大的机器学习技术。使用这些类通常涉及以下步骤:
- 实例化一个集成学习对象,指定所需的参数(例如基学习器的数量、类型等)。
- 使用
fit
方法在训练数据上训练模型。 - 使用
predict
方法对新数据进行预测。 - 使用
score
方法评估模型在测试数据上的性能。
这些集成学习方法通常能够提供比单个模型更好的泛化能力和鲁棒性,因此在机器学习竞赛和实际应用中非常受欢迎。