代码
代码获取方式:
链接:https://pan.baidu.com/s/1p4dHAyoG0nQzlRaT2VnKIA?pwd=n474
提取码:n474
count_classes = pd.value_counts(data['Class'], sort = True).sort_index()
直方图统计数量:
切分数据集:
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.3, random_state = 0)
交叉验证选取c参数:
建模评估召回
# 逻辑回归模型 lr = LogisticRegression(C = best_c, penalty = 'l1',solver='liblinear') # 训练集训练 lr.fit(X_train_undersample,y_train_undersample.values.ravel()) # 测试集预测 y_pred_undersample = lr.predict(X_test_undersample.values) # Compute confusion matrix 测试集计算 cnf_matrix = confusion_matrix(y_test_undersample,y_pred_undersample) np.set_printoptions(precision=2) # #Recall = TP/(TP+FN) print("Recall metric in the testing dataset: ", cnf_matrix[1,1]/(cnf_matrix[1,0]+cnf_matrix[1,1]))
调优方案:
下采样训练数据集训练模型,全量的测试集测试,计算全量测试集的混沌矩阵。
全量训练数据集训练模型,全量的测试集测试,计算全量测试集的混沌矩阵。
下采样训练数据集训练模型,下采样的测试集测试(带概率阈值),计算下采样测试集的混沌矩阵。
概念
逻辑回归是一种用于解决分类问题的机器学习算法。尽管名字中包含“回归”,但逻辑回归实际上是一种分类算法,用于预测输入变量属于某个特定类别的概率。
逻辑回归的原理基于线性回归,但它使用了一个称为逻辑函数(也称为 Sigmoid 函数)来将线性输出转换为概率值。
训练逻辑回归模型通常通过最大化似然函数或最小化对数损失函数来完成。一旦模型训练完成,它就可以用来进行预测,预测输入样本属于哪个类别的概率。
逻辑回归在实践中广泛应用于二分类问题,例如垃圾邮件检测、信用风险评估等。
逻辑回归是一种广泛应用的统计方法,主要用于分类问题,特别是二分类问题。
逻辑回归建模的一般流程
1. 问题定义
首先明确要解决的问题是一个分类问题,并确定是二分类还是多分类问题。对于逻辑回归,通常用于二分类,即输出只有两个类别。
2. 数据收集
收集相关的数据集,包括特征变量(自变量X)和目标变量(因变量Y)。确保数据的质量和完整性。
3. 数据预处理
- 数据清洗:处理缺失值、异常值和重复值。
- 特征工程:包括特征选择和特征转换,选择与目标变量相关的特征,进行必要的特征转换,如归一化、标准化、编码等。
在逻辑回归中处理类别型特征
1. 编码(Encoding)独热编码(One-Hot Encoding):为每个类别创建一个二进制列(0或1),其中只有一个列对于每个样本是1,其余都是0。这种方法适用于类别数量不是很多时;标签编码(Label Encoding):将每个类别映射到一个唯一的整数。这种方法可能不适用于逻辑回归,因为它会赋予类别一个数值上的顺序,这可能对模型产生误导。
2. 二进制编码(Binary Encoding)对于具有大量类别的特征,可以使用二进制编码。首先对类别进行标签编码,然后将每个整数值转换为二进制形式,并分别作为新的特征列。
3. 哈希编码(Hash Encoding)使用哈希函数将类别名称映射到固定数量的桶(通常小于类别数)。这种方法在类别非常多时很有用,但可能会导致哈希冲突。
4. 伪计数(Pseudo Counts)为每个类别分配一个计数,然后使用这些计数作为特征值。这种方法适用于有序类别特征。
5. 向量化(Embedding)可以将类别特征通过嵌入层(embedding layer)转换为稠密的数值向量。在处理大量类别时特别有效。
6. 归一化效应编码(Effect Encoding)/偏差编码(Deviation Encoding)
这种方法类似于独热编码,但在每个独热编码的基础上添加了一个额外的列来表示平均效应或偏差。
7. 后续处理
在逻辑回归模型中,编码后的类别特征可以直接作为输入。但是,如果类别特征之间存在某种顺序关系,可以考虑将它们转换为有序的数值特征,例如使用有序编码。
在处理类别型特征时,重要的是要考虑特征的基数(不同类别的数量)和稀疏性。高基数特征可能导致过度拟合或计算效率低下,而稀疏特征可能需要特殊处理以避免模型过于复杂。在实际应用中,可能需要尝试不同的编码方法,并通过交叉验证来选择最佳方法。
归一化(Normalization)和标准化(Standardization)
两种常见的特征缩放方法,用于预处理数据,特别是在机器学习中。它们的目的都是将特征数据的规模调整到一定的范围内,以便于模型的训练和改善模型的性能。但是,它们的方法和适用场景有所不同。
归一化通常是指将数据缩放到一个固定的范围(通常是0到1之间)。归一化公式如下:最小值和最大值。
归一化的优点是能够将不同范围的特征统一到相同的尺度,适用于分布范围差异较大的数据。但是,它对异常值比较敏感,异常值会影响最小值和最大值的计算,从而影响归一化结果。
标准化通常是指将数据转换为具有零均值和单位标准差的分布。
标准化的优点是能够使得数据分布更加稳定,特别是对于近似正态分布的数据。它对异常值的影响较小,因为标准化方法是基于整体的统计量(均值和标准差),而不是依赖于最大值和最小值。
- **归一化**:
- 当数据分布不明确,或者最小值和最大值未知时(如神经网络中的激活函数)。
- 当特征之间的量级差异很大,且最小值和最大值对于后续模型很重要时。
- **标准化**:
- 当数据近似正态分布,或者对数据的分布没有明确要求时。
- 当使用基于距离的算法(如K-近邻、K-均值聚类、支持向量机等)时。
在实际应用中,选择哪种方法取决于数据的特性和使用的模型。有时,为了达到最佳效果,可能需要尝试不同的缩放方法,并通过交叉验证来选择最佳方法。
- 数据分割:将数据集分为训练集和测试集,通常采用70%-30%,60%-40%或其它比例。
4. 模型建立
- 选择模型类型:确定使用二项逻辑回归还是多项逻辑回归。
二项逻辑回归适用于二分类问题,即目标变量只有两个类别。
在实际应用中,多项逻辑回归可以通过多个二项逻辑回归模型来实现,这种方法称为“一对多”(One-vs-All 或 One-vs-Rest)策略,其中每个类别都有一个模型来与所有其他类别区分开来。但是,这种方法可能会导致类别不平衡问题,因为每个模型都是单独训练的。相比之下,多项逻辑回归考虑了所有类别之间的相互关系,通常能够提供更好的性能。
- 模型训练:使用训练集数据来训练模型,通过最大似然估计方法来求解模型参数。
- 模型评估:使用诸如准确率、召回率、F1分数、AUC值等指标来评估模型性能。
注:逻辑函数(Logistic Function)和Sigmoid函数实际上是同一个函数,只是名称不同。在数学、统计学和机器学习领域,这个函数通常被称为逻辑斯谛函数(Logistic Function)或Sigmoid函数。
5. 参数调优
- 确定优化目标:通常是选择交叉熵作为损失函数。
- 选择优化算法:如梯度下降法、牛顿法等。
- 调参:通过调整学习率、正则化参数等来优化模型。
6. 模型诊断
检查模型是否存在过拟合或欠拟合问题,可能需要回到特征工程步骤进行调整,或者通过增加训练样本、减少特征数量等方式来解决。
7. 模型部署
将训练好的模型部署到生产环境中,进行实时预测或批量预测。
8. 模型监控与维护
持续监控模型的性能,确保其预测结果的准确性和稳定性。定期使用新收集的数据对模型进行重新训练和评估。
逻辑回归建模是一个迭代的过程,可能需要多次回到前面的步骤进行优化。在整个过程中,确保遵循数据安全和隐私保护的相关规定。
案例与参数
C 参数是一个惩罚参数
用于正则化项的系数。在 scikit-learn 库中,当你使用逻辑回归(Logistic Regression)时,C 参数控制了正则化强度的倒数。C 参数与正则化项的系数α之间的关系是C = 1/α。
逻辑回归中常用的正则化形式是 L1 正则化和 L2 正则化,分别对应于 Lasso 和 Ridge 正则化。在 scikit-learn 中 penalty 参数来选择使用哪一种正则化,'l1' 表示 L1 正则化,而 'l2' 表示 L2 正则化。
- 当 C 的值很小时,模型会受到较强的正则化,这意味着模型会尽量让权重值较小,可能会导致模型过于简单,出现欠拟合。
- 当 C 的值很大时,正则化的影响会很小,模型会尽量拟合训练数据,这可能会导致过拟合。
- 当 C 等于 1 时(默认值),表示没有正则化。 选择合适的 C 值通常需要通过交叉验证(如 GridSearchCV)来调整,以便在训练数据上获得最佳的泛化性能。 在 scikit-learn 中使用逻辑回归时,你可以这样设置 C 参数:
from sklearn.linear_model import LogisticRegression
log_reg = LogisticRegression(C=0.1, penalty='l2')
# 使用 L2 正则化,C=0.1 log_reg.fit(X_train, y_train)
这里的 C=0.1 表示使用了较强的正则化。你需要根据你的具体问题和数据集来调整这个值。
权重大小与模型的复杂度有一定关系,并不是绝对的。
模型的复杂度通常与模型能够捕捉的数据特征的数量和类型有关,而权重的大小只是其中的一个方面。
1. **权重的大小**:在实施了正则化的模型中,权重的大小可以被看作是模型复杂度的一个指标。正则化(如L1或L2正则化)会惩罚模型权重的大小,目的是为了防止过拟合。当权重很小时,可能意味着模型更加简单,因为它倾向于减少特征对模型的影响,可能会导致模型欠拟合。
2. **模型的复杂度**:模型的复杂度还与其他因素有关,比如模型的结构、特征的数量和交互作用、以及模型参数的数量。例如,一个深度神经网络即使权重很小,也可能是一个非常复杂的模型,因为它可以捕捉到输入特征之间的高阶交互作用。
3. **权重与复杂度的关系**:在一些情况下,权重的大小确实可以反映模型的复杂度。例如,在逻辑回归中,如果使用了L1正则化(Lasso回归),权重的小值可能意味着模型选择了较少的特征,从而简化了模型。相反,如果没有正则化或正则化强度很弱,即使权重很大,模型也可能很简单,因为它可能只依赖于少数几个强相关的特征。
4. **权重与性能的关系**:权重的大小也会影响模型的性能。一个过于简单的模型可能无法捕捉数据的真实结构,而一个过于复杂的模型可能会导致过拟合。因此,找到合适的权重大小和模型复杂度是机器学习中的一个重要任务。
总之,权重的大小可以作为衡量模型复杂度的一个指标,但它并不是唯一的指标。在实际应用中,需要综合考虑模型的结构、特征的选择、正则化的使用以及模型的性能等因素。
KFold 分割一种交叉验证的方法
它将数据集分成 K 个大小相等的互斥的折叠(folds)。在 KFold 交叉验证中,每次迭代都会使用一个折叠作为验证集,而剩下的 K-1 个折叠作为训练集。这个过程会重复 K 次,每次选择不同的折叠作为验证集,以便模型可以在不同的数据子集上进行训练和验证。
KFold 分割的目的是为了评估模型的泛化能力,即模型在未见过的数据上的表现。通过将数据集分成多个折叠,我们可以确保模型在不同的数据子集上进行了训练和测试,从而得到一个更稳健的性能评估。
from sklearn.model_selection import KFold
# 假设 X 是特征数据集,y 是目标变量
X = ... # 特征数据集
y = ... # 目标变量
# 创建 KFold 分割实例,这里 K=5 kf = KFold(n_splits=5)
# 进行 KFold 分割
for train_index, test_index in kf.split(X):
X_train, X_test = X[train_index],
X[test_index] y_train,
y_test = y[train_index],
y[test_index] # 在这里训练和评估模型
在这个例子中,KFold 类的 split 方法会生成训练集和验证集的索引,然后我们可以使用这些索引来分割数据集 X 和 y。这种方法有助于我们更准确地评估模型的性能,并调整模型参数以获得更好的泛化能力。
random_state
控制在算法中任何随机性操作的可重复性。在很多情况下我们希望结果是可以复现的,尤其是在调试或者进行科学实验时。设置 `random_state` 参数可以确保每次代码运行时得到相同的结果。
以下是一些常见的使用 `random_state` 的场景:
1. **数据分割**:当我们使用 `train_test_split` 函数将数据集分割为训练集和测试集时,可以设置 `random_state` 确保每次分割得到相同的结果。
```python
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
```
2. **模型初始化**:某些机器学习模型在初始化时会有随机性,例如随机森林(`RandomForestClassifier`)和梯度提升树(`GradientBoostingClassifier`)。设置 `random_state` 可以确保模型初始化的一致性。
```python
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
```
3. **数据混洗**:在使用诸如 `shuffle` 的函数对数据进行混洗时,设置 `random_state` 可以确保混洗结果的可重复性。
```python
import numpy as np
np.random.seed(42)
np.random.shuffle(data)
```
4. **参数搜索**:在使用网格搜索(`GridSearchCV`)或随机搜索(`RandomizedSearchCV`)来寻找模型的最佳参数时,`random_state` 可以确保搜索过程的可重复性。
```python
from sklearn.model_selection import GridSearchCV
param_grid = {'C': [0.1, 1, 10]}
grid_search = GridSearchCV估计器, param_grid, cv=5, random_state=42)
```
`random_state` 是一个确保代码可重复性的重要参数。在实际应用中,选择一个固定的整数作为 `random_state` 的值是一个好习惯,尤其是当你需要与他人分享代码或者记录实验结果时。通常,`42` 被用作一个流行的 `random_state` 值,这源自于科幻小说《银河系漫游指南》中“生命、宇宙以及任何事情的终极答案”的典故。
技巧
pd.value_counts 统计直方图,查看不同分类的数量;
StandardScaler().fit_transform:数据均值、标准差进行标准化,有助于提升模型的性能和收敛速度。
data.iloc 获取训练数据和标签列;
np.random.choice:随机获取多的样本与少的样本一致,相当于下采样。
train_test_split:按照比例划分训练集和测试集
KFold :交叉验证的方法,将数据集分成 K 个大小相等的折叠(folds)。在 KFold 交叉验证中,每次迭代会使用一个折叠作为验证集,剩下的 K-1 个折叠作为训练集。有助于评估模型的泛化能力,并且可以更有效地利用数据。
pd.DataFrame:创建表格存储不同的参数列
fold.split(y_train_data):将交叉验证的训练数据集打折分开成两部分。注意操作的是训练集,交叉得到最佳c参数
LogisticRegression(C = c_param, penalty = 'l1',solver='liblinear') 创建模型。
lr.fit 模型训练。
lr.predict 模型预测。
recall_score 计算回归得分;输入真正标签和预测标签;召回率或真正率。tp / (tp + fn)
confusion_matrix:计算混沌矩阵,利用以上交叉得到的c参数,训练得到模型,并预测测试集,然后预测与真值输入计算混沌矩阵。
怎么通过混沌矩阵评价机器学习模型好坏
混沌矩阵(Confusion Matrix),也称为混淆矩阵,是一种特别适用于监督学习的评估分类模型性能的工具,尤其是在分类问题中用来可视化算法性能的表格布局。它展示了实际类别与模型预测类别的关系,通过这个矩阵可以计算出许多性能指标,如精确度(Precision)、召回率(Recall)、F1分数(F1 Score)等。
混沌矩阵的基本结构如下:
- 真正(True Positive, TP):模型正确预测到的正类别。
- 假正(False Positive, FP):模型错误预测为正类别的负类别,也称为“假警报”。
- 假负(False Negative, FN):模型错误预测为负类别的正类别,也称为“漏报”。
- 真负(True Negative, TN):模型正确预测到的负类别。
- 精确度(Precision)是针对预测结果而言的,它表示在所有被预测为正类的样本中,真正为正类的比例。
Precision = TP / {TP + FP}
- 召回率(Recall)是针对原始数据而言的,它表示在所有真正的正类样本中,被正确预测为正类的比例。
Recall = TP / {TP + FN}
- F1分数(F1 Score)是精确度和召回率的调和平均值,用于综合反映模型的精确性和鲁棒性。
F1 Score = 2 * {Precision * Recall} / {Precision + Recall}
- 准确率(Accuracy)是所有预测正确的样本(真正和真负)占所有样本的比例。
Accuracy = {TP + TN} / {TP + TN + FP + FN}
使用混沌矩阵评价机器学习模型的好坏时,应根据具体的应用场景和业务需求来确定哪些指标更为重要。例如,在医疗诊断领域,通常更关注召回率,以减少漏诊的风险;而在垃圾邮件过滤中,精确度可能更为重要,以避免误将正常邮件归类为垃圾邮件。
还可以通过绘制ROC曲线(Receiver Operating Characteristic Curve)和计算AUC(Area Under the ROC Curve)值来评估分类模型的性能,特别是在类别不平衡的情况下。总之,混沌矩阵是评价机器学习模型性能的重要工具,通过它可以获得多个维度的性能指标,帮助判断模型在实际应用中的适用性和有效性。
ROC(Receiver Operating Characteristic)曲线
用于评估二分类模型的性能。ROC曲线基于不同的阈值,展示了模型在假正例率(False Positive Rate, FPR)和真正例率(True Positive Rate, TPR)之间的权衡。
基本概念:
- 真正例率(TPR),也称为灵敏度或召回率,表示所有正例中被正确识别的比例。
- 假正例率(FPR),表示所有负例中被错误识别的比例。
ROC曲线的解读:
- 曲线位置:ROC曲线位于坐标系的单位正方形内,其中横轴是FPR,纵轴是TPR。理想的ROC曲线会尽可能地靠近左上角,这意味着模型有很高的TPR和很低的FPR。
- 曲线形状:曲线越靠近左上角,模型的性能越好。一个完美的分类器会有一个ROC曲线,它在FPR为0时TPR为1,即模型能够正确识别所有正例而不产生任何假正例。
- 曲线下的面积(AUC):ROC曲线下的面积(AUC)是一个量化模型性能的指标,取值范围从0到1。AUC越接近1,模型性能越好;AUC为0.5表示模型的性能和随机猜测一样。
- 阈值变化:ROC曲线考虑了所有可能的分类阈值,通过调整阈值,可以在不同的TPR和FPR之间做出权衡。曲线上的每个点对应于一个特定的阈值。
- 比较模型:如果有多个模型的ROC曲线,可以通过比较它们的AUC值或者观察ROC曲线之间的相对位置来评估哪个模型更好。
实际应用:
- 在医疗诊断中,高TPR(减少漏诊)通常比低FPR(减少误诊)更重要,因此ROC曲线会侧重于TPR。
- 在信用卡欺诈检测中,由于假正例(误诊为欺诈)的成本可能很高,因此可能更关注低FPR。