从0到1学Pandas(七):Pandas 在机器学习中的应用

目录

  • 一、数据预处理
    • 1.1 特征提取
    • 1.2 数据标准化与归一化
    • 1.3 特征编码
  • 二、特征工程
    • 2.1 特征选择​
    • 2.2 特征组合与衍生​
    • 2.3 缺失值处理策略​
  • 三、模型训练与评估
    • 3.1 数据集划分
    • 3.2 模型训练与预测
    • 3.3 模型评估与调优
  • 四、Pipeline 构建
    • 4.1 自动化工作流
    • 4.2 模型部署与应用
    • 4.3 模型监控与更新


一、数据预处理

在机器学习中,数据预处理是至关重要的环节,它直接影响到模型的性能和效果。Pandas 作为强大的数据处理库,在数据预处理中发挥着关键作用。下面将详细介绍数据预处理中的几个重要步骤。

1.1 特征提取

特征提取是从原始数据中获取有价值信息的过程,这些信息将作为机器学习模型的输入特征。对于文本特征提取,常用的工具是scikit-learn库中的CountVectorizer和TfidfVectorizer。CountVectorizer用于统计文本中每个词的出现次数,将文本转换为词频矩阵。例如:

from sklearn.feature_extraction.text import CountVectorizercorpus = ["机器学习需要数据", "深度学习需要大量数据"]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)
print(vectorizer.get_feature_names())
print(X.toarray())

运行上述代码,输出结果如下:

['大量', '学习', '数据', '深度', '机器学习', '需要']
[[0 1 1 0 1 1][1 1 1 1 0 1]]

可以看到,CountVectorizer统计了所有文章中的词,并对每篇文章在词的列表里统计每个词出现的次数。

TfidfVectorizer则是通过加权词频(TF)和逆文档频率(IDF)来衡量词语的重要性,公式为:TF−IDF(t,d)=TF(t,d)×log(NDF(t))TF - IDF(t,d) = TF(t,d) \times log(\frac{N}{DF(t)})TFIDF(t,d)=TF(t,d)×log(DF(t)N),其中NNN为总文档数,DF(t)DF(t)DF(t)为包含词ttt的文档数。这种方法能更好地突出文本中的关键信息,常用于文本分类、关键词提取等任务。

对于时间特征提取,pandas提供了强大的时间序列处理功能。可以将时间字符串转换为datetime类型,然后提取出年、月、日、时、分、秒等信息作为特征。例如:

import pandas as pddata = {'date': ['2024-01-01 10:00:00', '2024-01-02 15:30:00']}
df = pd.DataFrame(data)
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['month'] = df['date'].dt.month
df['day'] = df['date'].dt.day
df['hour'] = df['date'].dt.hour
print(df)

输出结果为:

                 date  year  month  day  hour
0 2024-01-01 10:00:00  2024      1    1    10
1 2024-01-02 15:30:00  2024      1    2    15

这样就成功提取了时间特征,这些特征可以为机器学习模型提供更多关于时间的信息,有助于提高模型的预测能力。

1.2 数据标准化与归一化

数据标准化与归一化是为了消除不同特征之间的量纲差异,使数据具有可比性,同时也有助于提升模型的训练效果。常见的标准化方法有 Z-score 标准化和 Min-Max 缩放。

Z-score 标准化,又称标准分数或零均值单位方差标准化,是一种将数据转换为均值为 0、标准差为 1 的标准正态分布的方法。其计算公式为:Z=(X−μ)σZ = \frac{(X - \mu)}{\sigma}Z=σ(Xμ),其中XXX是原始数据值,μ\muμ是数据的均值,σ\sigmaσ是数据的标准差。通过这种转换,可以消除不同数据尺度之间的差异,使得不同特征具有可比性,这在机器学习、统计分析及数据挖掘中尤为重要,因为它有助于提高算法的收敛速度和预测精度。在scikit-learn库中,可以使用StandardScaler类来实现 Z-score 标准化。示例代码如下:

from sklearn.preprocessing import StandardScaler
import numpy as np# 示例数据
data = np.array([[1], [2], [3], [4], [5]])
# 创建StandardScaler对象
scaler = StandardScaler()
# 拟合并转换数据
standardized_data = scaler.fit_transform(data)
print(standardized_data)

运行上述代码,会将输入数据标准化为均值为 0、标准差为 1 的分布,便于后续的分析和建模。

Min-Max 缩放是一种线性变换,通过将原始数据减去最小值并除以最大值与最小值之间的差来实现。它将原始数据缩放到一个固定范围,通常是[0,1][0,1][0,1]。公式为:X′=(X−Xmin)(Xmax−Xmin)X' = \frac{(X - X_{min})}{(X_{max} - X_{min})}X=(XmaxXmin)(XXmin),其中XXX是原始数据,XminX_{min}XminXmaxX_{max}Xmax分别是该特征的最小值和最大值,X’X’X是缩放后的值。这种方法简单易实现,且能直观地理解数据分布范围,但对于异常值非常敏感,不适用于数据分布不是线性的场景。当数据处理范围外的新数据出现时,模型可能无法作出正确预测,需要重新计算新的最大和最小值。在实际应用中,可以使用scikit-learn库中的MinMaxScaler类来实现 Min-Max 缩放。示例代码如下:

from sklearn.preprocessing import MinMaxScaler
import numpy as np# 示例数据
data = np.array([[1], [2], [3], [4], [5]])
# 创建MinMaxScaler对象
scaler = MinMaxScaler()
# 拟合并转换数据
scaled_data = scaler.fit_transform(data)
print(scaled_data)

上述代码会将数据缩放到([0,1])区间内,展示了 Min-Max 缩放的具体实现过程。

1.3 特征编码

在机器学习中,许多模型要求输入数据是数值型的,因此需要对分类变量进行编码。常见的编码方式有独热编码和标签编码。

独热编码(One-Hot Encoding),也被称作名义编码(Nominal Encoding),是将分类变量转换为二进制形式的过程。在这种表示法中,每个类别值被表示为一个新的二进制列,并且这些列在原始数据集中是独立的。每个类别值的二进制向量只会在对应类别的位置上有一个 1,其他位置都是 0。这种编码方式使得所有的类别值都可以通过 0 和 1 来表示,从而保持了类别之间的离散性,避免了为类别变量赋予顺序关系而可能带来的误导。在pandas中,可以使用get_dummies函数进行独热编码。例如:

import pandas as pddata = {'color': ['red', 'green', 'blue']}
df = pd.DataFrame(data)
encoded_df = pd.get_dummies(df)
print(encoded_df)

输出结果为:

   color_blue  color_green  color_red
0           0            0          1
1           0            1          0
2           1            0          0

可以看到,color列的分类变量被成功转换为了独热编码形式,每个类别对应一个新的二进制列。

标签编码(Label Encoding)是一种将分类变量转换为数值型的方法,通过给每个类别分配一个唯一的整数来实现,这样每个类别都对应一个数值,从而可以被模型所使用。但需要注意的是,标签编码为类别变量赋予了一个顺序关系,这在某些情况下可能会误导模型。在scikit-learn库中,可以使用LabelEncoder类进行标签编码。示例代码如下:

from sklearn.preprocessing import LabelEncoder# 原始类别数据
categories = ['cat', 'dog','mouse', 'cat', 'dog']
# 创建LabelEncoder实例
label_encoder = LabelEncoder()
# 对数据进行编码
encoded_categories = label_encoder.fit_transform(categories)
print(encoded_categories)

运行上述代码,输出结果为:

[0 1 2 0 1]

可以看到,cat被编码为 0,dog被编码为 1,mouse被编码为 2 ,实现了分类变量到数值的转换。在实际应用中,需要根据数据的特点和模型的要求选择合适的编码方式。

二、特征工程

在机器学习流程中,特征工程是连接数据与模型的关键桥梁。优质的特征能够大幅提升模型性能,而 Pandas 凭借其强大的数据操作能力,成为特征工程实施的核心工具。接下来,我们将深入探讨特征选择、特征组合与衍生以及缺失值处理的进阶策略。​

2.1 特征选择​

特征选择的目的是从众多特征中筛选出对目标变量预测最有价值的子集,减少冗余信息,降低模型复杂度,提升训练效率和泛化能力。Pandas 结合 scikit-learn 库,能高效实现多种特征选择方法。​

过滤法(Filter Methods)基于特征与目标变量的统计关系进行筛选,不依赖具体模型。例如,可通过计算特征与目标变量的皮尔逊相关系数、互信息值等指标,保留高相关性特征。使用 Pandas 的corr()方法能快速计算特征间的相关系数,再结合sort_values()排序后筛选:​

# 计算特征与目标变量的相关系数
corr_matrix = df.corr()
target_corr = corr_matrix['target'].abs().sort_values(ascending=False)
# 选择相关性最高的前10个特征
selected_features = target_corr[:10].index.tolist()
filtered_df = df[selected_features + ['target']]

包装法(Wrapper Methods)将特征选择视为搜索问题,通过不断迭代选择最优特征子集。以递归特征消除(RFE)为例,它从所有特征开始,逐步移除对模型性能影响最小的特征。结合 Pandas 数据框和 scikit-learn 的 RFE 类,可实现自动化选择:​

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression# 定义模型和RFE选择器
model = LinearRegression()
rfe = RFE(model, n_features_to_select=5)  # 选择5个特征
# 拟合数据
rfe.fit(df.drop('target', axis=1), df['target'])
# 获取选中的特征
selected_features = df.drop('target', axis=1).columns[rfe.support_].tolist()
wrapped_df = df[selected_features + ['target']]

嵌入法(Embedded Methods)则利用模型训练过程中产生的特征重要性指标进行选择,如线性回归的系数、决策树的特征重要性等。使用 Pandas 可方便地对这些指标进行排序和筛选:​

from sklearn.ensemble import RandomForestRegressor# 训练随机森林模型获取特征重要性
model = RandomForestRegressor()
model.fit(df.drop('target', axis=1), df['target'])
# 构建特征重要性系列并排序
feature_importance = pd.Series(model.feature_importances_, index=df.drop('target', axis=1).columns)
sorted_importance = feature_importance.sort_values(ascending=False)
# 选择重要性前10的特征
embedded_features = sorted_importance[:10].index.tolist()
embedded_df = df[embedded_features + ['target']]

2.2 特征组合与衍生​

通过特征组合与衍生,能挖掘出隐藏在原始特征中的深层信息,提升模型对数据模式的捕捉能力。特征交叉是常见的组合方式,例如将类别特征与数值特征相乘,或两个类别特征进行交叉:​

# 类别特征与数值特征交叉​
df['category_numeric_interaction'] = df['category_feature'] * df['numeric_feature']​
​
# 两个类别特征交叉​
df['category_cross'] = df['category1'] + '_' + df['category2']


多项式扩展可生成特征的高阶项和交叉项,适用于捕捉特征间的非线性关系。借助 scikit-learn 的 PolynomialFeatures 和 Pandas 的结合,能快速实现:​

from sklearn.preprocessing import PolynomialFeatures​
​
# 选择需要扩展的数值特征​
numeric_features = ['num1', 'num2', 'num3']​
poly = PolynomialFeatures(degree=2, include_bias=False)​
poly_features = poly.fit_transform(df[numeric_features])# 将生成的多项式特征转换为数据框并与原数据合并​
poly_df = pd.DataFrame(poly_features, columns=poly.get_feature_names_out(numeric_features))​
combined_df = pd.concat([df, poly_df], axis=1)​
​

此外,还可根据业务知识构建衍生特征,如从日期特征中衍生出周末 / 工作日标识、从用户行为数据中衍生出活跃度指标等。例如,基于用户的消费金额和消费次数,衍生出平均每次消费金额:​

df['avg_consumption_per_time'] = df['total_consumption'] / df['consumption_times']

2.3 缺失值处理策略​

对于机器学习模型,恰当的缺失值处理至关重要,不当的处理可能导致模型偏差或性能下降。除了基础的均值、中位数插补,更高级的方法能更好地保留数据分布特征。​

K 近邻插补(KNN Imputation)利用相似样本的特征值来填充缺失值,适用于数值型特征。通过 scikit-learn 的 KNNImputer 结合 Pandas 使用:​

from sklearn.impute import KNNImputer​
​
# 选择需要插补的数值特征​
numeric_features = df.select_dtypes(include=['float64', 'int64']).columns​
# 初始化KNN插补器​
imputer = KNNImputer(n_neighbors=5)# 进行插补并转换为数据框​
imputed_data = imputer.fit_transform(df[numeric_features])​
df_knn_imputed = df.copy()​
df_knn_imputed[numeric_features] = imputed_data​


多重插补(Multiple Imputation)通过构建多个完整数据集来处理缺失值,考虑了缺失值的不确定性,适用于复杂数据场景。使用 fancyimpute 库的 IterativeImputer:​

from fancyimpute import IterativeImputer​
​
# 初始化多重插补器​
imputer = IterativeImputer()# 进行插补​
imputed_data = imputer.fit_transform(df.select_dtypes(include=['float64', 'int64']))# 转换为数据框​
df_multiple_imputed = df.copy()​
df_multiple_imputed[df.select_dtypes(include=['float64', 'int64']).columns] = imputed_data​


对于分类特征的缺失值,可采用众数插补,或为缺失值单独设置一个类别,以保留缺失信息:​

# 众数插补​
df['category_feature_mode_imputed'] = df['category_feature'].fillna(df['category_feature'].mode()[0])​
​
# 缺失值设为单独类别​
df['category_feature_missing_as_category'] = df['category_feature'].fillna('Missing')​
​

在实际应用中,需根据特征类型、缺失比例以及模型特性选择合适的缺失值处理策略,必要时可通过交叉验证比较不同方法的效果。​

三、模型训练与评估

在完成数据预处理和特征工程后,接下来就进入到模型训练与评估阶段。这一阶段是机器学习的核心环节,直接关系到模型的性能和应用效果。

3.1 数据集划分

在机器学习中,为了准确评估模型的性能,需要将数据集划分为训练集、验证集和测试集。训练集用于训练模型,让模型学习数据中的模式和规律;验证集用于调整模型的超参数,防止模型过拟合;测试集则用于评估模型的泛化能力,即模型在未知数据上的表现。

使用 Pandas 进行数据集划分时,通常会结合scikit-learn库中的train_test_split函数。例如,假设有一个包含特征和目标变量的数据集,我们可以按照以下方式进行划分:

import pandas as pd
from sklearn.model_selection import train_test_split# 读取数据集
data = pd.read_csv('your_dataset.csv')
# 划分特征和目标变量
X = data.drop('target_column', axis=1)
y = data['target_column']
# 划分训练集和测试集,测试集占比20%
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 进一步从训练集中划分出验证集,验证集占训练集的20%
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=42)

在上述代码中,test_size参数指定了测试集或验证集所占的比例,random_state参数用于设置随机种子,确保每次划分的结果一致,便于实验的复现。通过合理划分数据集,可以更准确地评估模型的性能,避免模型在训练过程中出现过拟合或欠拟合的问题。

3.2 模型训练与预测

将 Pandas 数据框转换为模型输入格式时,需要根据具体的模型要求进行相应的处理。以逻辑回归模型为例,在scikit-learn库中,可以直接使用LogisticRegression类进行训练和预测。以下是具体的步骤和代码实现:

from sklearn.linear_model import LogisticRegression# 创建逻辑回归模型实例
model = LogisticRegression()
# 使用训练集数据进行模型训练
model.fit(X_train, y_train)
# 使用训练好的模型对测试集进行预测
y_pred = model.predict(X_test)

在上述代码中,首先创建了一个逻辑回归模型实例model,然后使用fit方法将训练集数据X_train和y_train传入模型进行训练,训练完成后,使用predict方法对测试集数据X_test进行预测,得到预测结果y_pred。通过这些步骤,就完成了从数据框到模型输入格式的转换以及模型的训练和预测过程。

3.3 模型评估与调优

模型评估是判断模型性能优劣的重要环节,常用的评估指标有准确率(Accuracy)、精确率(Precision)、召回率(Recall)、F1 分数(F1-Score)、混淆矩阵(Confusion Matrix)、ROC 曲线(Receiver Operating Characteristic Curve)等。

准确率是指预测正确的样本数占总样本数的比例,公式为:Accuracy=TP+TNTP+TN+FP+FNAccuracy = \frac{TP + TN}{TP + TN + FP + FN}Accuracy=TP+TN+FP+FNTP+TN,其中TPTPTP表示真正例,TNTNTN表示真负例,FPFPFP表示假正例,FNFNFN表示假负例。

精确率是指正确预测为正的样本数占全部预测为正的比例,公式为:Precision=TPTP+FPPrecision = \frac{TP}{TP + FP}Precision=TP+FPTP

召回率是指正确预测为正的样本数占全部实际为正的比例,公式为:Recall=TPTP+FNRecall = \frac{TP}{TP + FN}Recall=TP+FNTP

F1 分数是精确率和召回率的调和平均数,用于综合评估模型在精确率和召回率之间的平衡,公式为:F1=2×Precision×RecallPrecision+RecallF1 = \frac{2 \times Precision \times Recall}{Precision + Recall}F1=Precision+Recall2×Precision×Recall

混淆矩阵是一个展示模型预测结果与实际类别之间对应关系的矩阵,对于二分类问题,通常以 2x2 的矩阵形式出现,包含TPTPTPTNTNTNFPFPFPFNFNFN四个指标,通过混淆矩阵可以直观地了解模型的错误类型和分布情况。

ROC 曲线则是一种研究学习器泛化性能的有力工具,其纵轴是真正例率(True Positive Rate,TPR),即预测为正实际为正的样本数占全部实际为正的比例;横轴是假正例率(False Positive Rate,FPR),即预测为正实际为负的样本数占全部实际为负的比例。ROC 曲线越靠近左上角,说明模型的性能越好,AUC 值(Area Under ROC Curve)则是指 ROC 曲线下的面积,用于量化评估模型的性能,AUC 值越大,模型的性能越好,取值范围在 0.5 到 1 之间。

在 Python 中,可以使用scikit-learn库中的metrics模块来计算这些评估指标。例如:

from sklearn import metrics# 计算准确率
accuracy = metrics.accuracy_score(y_test, y_pred)
# 计算精确率
precision = metrics.precision_score(y_test, y_pred)
# 计算召回率
recall = metrics.recall_score(y_test, y_pred)
# 计算F1分数
f1_score = metrics.f1_score(y_test, y_pred)
# 计算混淆矩阵
confusion_matrix = metrics.confusion_matrix(y_test, y_pred)
# 计算ROC曲线和AUC值
fpr, tpr, thresholds = metrics.roc_curve(y_test, model.predict_proba(X_test)[:, 1])
auc = metrics.auc(fpr, tpr)

通过计算这些评估指标,可以全面了解模型的性能表现,发现模型存在的问题,进而进行针对性的改进。

超参数调优是提升模型性能的重要手段,它通过调整模型的超参数,找到一组最优的超参数组合,使模型在验证集上表现最佳。常见的超参数调优方法有网格搜索(Grid Search)、随机搜索(Random Search)、贝叶斯优化(Bayesian Optimization)等。

网格搜索是一种系统地搜索超参数空间的方法,它通过穷举搜索遍历所有可能的超参数组合,对于每组超参数,模型在训练集上训练并在验证集上评估性能,从而找到最佳组合。虽然网格搜索简单易实现,对于搜索空间较小的问题能找到全局最优解,但它的计算复杂度高,随着超参数的维度和可能取值数量增加,搜索空间呈指数级增长,且如果某些超参数的作用较小或对模型性能影响不大,依然会浪费大量计算资源。

随机搜索则是从所有可能的超参数组合中随机选择一定数量的组合进行尝试,而不是穷尽所有可能性。与网格搜索相比,随机搜索计算效率高,通过减少搜索空间中的点,显著降低计算成本,在高维空间中更有可能找到接近最优的解,但它没有系统性,不保证找到全局最优解,且需要事先定义采样数量。

贝叶斯优化基于高斯过程模型,根据之前的结果选择下一个超参数组合进行评估,它利用贝叶斯统计理论构建代理模型来预测目标函数的表现,从而高效地搜索超参数空间,适用于高维度的超参数搜索,但计算成本也相对较高。

在scikit-learn库中,可以使用GridSearchCV和RandomizedSearchCV类来实现网格搜索和随机搜索。例如:

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from scipy.stats import randint# 定义随机森林模型
model = RandomForestClassifier(random_state=42)# 定义超参数网格
param_grid = {'n_estimators': [10, 50, 100],'max_depth': [5, 10, 15],'min_samples_split': [2, 5, 10]
}# 使用GridSearchCV进行网格搜索
grid_search = GridSearchCV(estimator=model, param_grid=param_grid, cv=3, scoring='accuracy')
grid_search.fit(X_train, y_train)
print("Best parameters (Grid Search):", grid_search.best_params_)# 定义超参数分布
param_dist = {'n_estimators': randint(10, 200),'max_depth': randint(5, 50),'min_samples_split': randint(2, 20)
}# 使用RandomizedSearchCV进行随机搜索
random_search = RandomizedSearchCV(estimator=model, param_distributions=param_dist, n_iter=10, cv=3, scoring='accuracy', random_state=42)
random_search.fit(X_train, y_train)
print("Best parameters (Random Search):", random_search.best_params_)

在上述代码中,首先定义了一个随机森林模型model,然后分别定义了超参数网格param_grid和超参数分布param_dist,接着使用GridSearchCV和RandomizedSearchCV进行网格搜索和随机搜索,通过fit方法在训练集上进行训练和超参数调优,并输出最佳的超参数组合。通过超参数调优,可以进一步提升模型的性能,使其更好地适应实际应用的需求。

四、Pipeline 构建

4.1 自动化工作流

在机器学习项目中,构建自动化工作流可以大大提高工作效率,减少人为错误。使用scikit-learn库中的Pipeline类,可以将数据预处理和模型训练等步骤整合在一起,形成一个连贯的工作流程。Pipeline类的作用是将多个数据处理步骤和机器学习模型按照顺序组合成一个单一的对象,使得整个数据处理和建模过程可以通过一次调用完成。

例如,我们可以将数据标准化、特征选择和逻辑回归模型训练组合在一个Pipeline中:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.feature_selection import SelectKBest, f_classif
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 构建Pipeline
pipeline = Pipeline([('scaler', StandardScaler()),('selector', SelectKBest(score_func=f_classif, k=3)),('classifier', LogisticRegression())
])# 训练模型
pipeline.fit(X_train, y_train)# 预测
y_pred = pipeline.predict(X_test)

在上述代码中,Pipeline包含了三个步骤:首先使用StandardScaler进行数据标准化,接着使用SelectKBest和f_classif进行特征选择,最后使用LogisticRegression进行模型训练。通过这种方式,我们可以方便地对整个工作流程进行管理和维护,并且在进行交叉验证和模型评估时,也能更加方便地应用于整个流程。同时,Pipeline还能确保数据在各个步骤之间的传递和处理是正确且一致的,避免了在不同步骤中对数据进行重复处理或错误处理的风险。

4.2 模型部署与应用

将训练好的模型部署到生产环境是机器学习项目的重要环节,它使得模型能够为实际业务提供服务。常见的部署方式有以 Web 服务或批处理方式进行部署。

以 Web 服务为例,我们可以使用Flask或FastAPI等框架将模型封装成 API 接口,方便其他系统调用。下面是一个使用Flask框架部署模型的简单示例:

from flask import Flask, request, jsonify
import joblib# 创建Flask应用
app = Flask(__name__)# 加载训练好的模型
model = joblib.load('trained_model.pkl')@app.route('/predict', methods=['POST'])
def predict():# 获取请求中的数据data = request.json# 进行预测prediction = model.predict(data)return jsonify({'prediction': prediction.tolist()})if __name__ == '__main__':app.run(debug=True)

在这个示例中,首先创建了一个Flask应用,然后加载了训练好的模型。接着定义了一个/predict的路由,当接收到 POST 请求时,从请求中获取数据并使用模型进行预测,最后将预测结果以 JSON 格式返回。

对于批处理方式,通常是将模型应用于一批数据文件。例如,我们有一批存储在 CSV 文件中的数据,需要使用训练好的模型进行预测,可以按照以下步骤进行:

import pandas as pd
import joblib# 加载训练好的模型
model = joblib.load('trained_model.pkl')# 读取CSV数据
data = pd.read_csv('new_data.csv')# 进行预测
predictions = model.predict(data)# 将预测结果保存到新的CSV文件
result_df = pd.DataFrame({'prediction': predictions})
result_df.to_csv('prediction_results.csv', index=False)

通过上述步骤,实现了将模型应用到新数据上进行预测,并将预测结果保存到文件中,满足了批处理的需求。

4.3 模型监控与更新

使用 Pandas 监控模型在线性能是确保模型持续有效的重要手段。可以通过定期计算模型的性能指标,如准确率、精确率、召回率等,来评估模型的表现。同时,分析预测结果的分布情况,检查是否存在异常值或偏差,也是监控模型性能的有效方法。例如,我们可以从生产环境中获取模型的预测结果和实际标签数据,计算性能指标:

import pandas as pd
from sklearn import metrics# 假设从生产环境获取的数据
data = pd.read_csv('production_data.csv')
y_true = data['actual_label']
y_pred = data['predicted_label']# 计算准确率
accuracy = metrics.accuracy_score(y_true, y_pred)
# 计算精确率
precision = metrics.precision_score(y_true, y_pred, average='weighted')
# 计算召回率
recall = metrics.recall_score(y_true, y_pred, average='weighted')print(f"Accuracy: {accuracy}")
print(f"Precision: {precision}")
print(f"Recall: {recall}")

定期更新模型是为了让模型适应数据分布的变化和业务需求的改变,保持模型的准确性和有效性。随着时间的推移,数据分布可能会发生变化,新的数据可能包含新的模式和趋势,如果模型不及时更新,其性能可能会下降。更新模型的方法通常是重新收集数据,进行数据预处理和特征工程,然后使用新的数据重新训练模型,并将新模型部署到生产环境中。例如:

# 重新收集数据
new_data = pd.read_csv('newly_collected_data.csv')
# 划分特征和目标变量
X_new = new_data.drop('target_column', axis=1)
y_new = new_data['target_column']# 重新训练模型
from sklearn.linear_model import LogisticRegression
new_model = LogisticRegression()
new_model.fit(X_new, y_new)# 保存新模型
import joblib
joblib.dump(new_model, 'updated_model.pkl')

通过上述步骤,实现了模型的更新,确保模型能够持续准确地为业务提供服务。在实际应用中,还可以结合自动化部署工具,实现模型的自动更新,提高模型的运维效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/91297.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/91297.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LangChain和LangGraph 里面的 `create_react_agent`有什么不同

这两个函数虽然名称相同,但来自不同的库(LangChain 和 LangGraph),它们在实现和使用上有一些关键区别: 主要区别特性LangChain 的 create_react_agentLangGraph 的 create_react_agent所属库LangChainLangGraph设计目的…

PostgreSQL 与 Oracle 数据库字段类型的详细对比

一、数值类型对比数据类型OraclePostgreSQL说明整数NUMBER(p,0)SMALLINT/INT/BIGINTOracle 统一用 NUMBER,PG 区分精度范围浮点数BINARY_FLOATREAL单精度浮点双精度浮点BINARY_DOUBLEDOUBLE PRECISION双精度浮点高精度小数NUMBER(p,s)NUMERIC(p,s)精确数值存储自增序…

JVM 性能调优实战:让系统性能 “飞” 起来的核心策略

在 Java 应用的生命周期中,性能问题如同隐藏的 “暗礁”—— 初期可能不显眼,但随着用户量增长和业务复杂度提升,微小的性能损耗会被无限放大,最终导致系统响应迟缓、频繁卡顿甚至崩溃。JVM 性能调优的目标,就是通过优…

Android Handler 完全指南

在 Android 开发中,Handler 是线程通信的核心工具 —— 当你在子线程下载图片后需要更新 UI,当你在 TCP 连接中收到数据需要通知界面,当你需要延迟执行某个任务时,都会用到 Handler。这个看似简单的类,却蕴含着 Androi…

梳理Ego-Planner模式下5通道、6通道与无人机模式的关系

Copilot said: 你需要梳理Ego-Planner模式下5通道、6通道与无人机模式的关系,以及轨迹跟随、紧急情况和人工接管的流程。下面结合你的描述和三张图片,对核心逻辑进行总结和整理: --- ## 一、状态组合与对应模式(见图1)…

odbc和jdbc什么区别

ODBC 和 JDBC 都是用于连接和操作数据库的标准接口,但它们分别面向不同的编程语言和平台。下面是它们的区别与对比,帮助你理解它们的用途和适用场景。📊 一、基本概念对比特性ODBC(Open Database Connectivity)JDBC&am…

境外期货Level2高频Tick历史行情数据获取与应用指南

在金融量化分析中,本地数据的高效使用是提升策略效果的重要基础。本文以CSV格式的本地数据为核心,以外盘期货分钟数据、CME/COMEX/CBOT历史行情为例,阐述专业化的数据处理与应用方法,为研究者提供可行性方案。一、数据预处理标准化…

迅为RK3588开发板安卓GPIO调用-APP运行测试

将网盘上的安卓工程文件复制到 Windows 电脑上。确保工程路径中使用英文字符,不包含中文。接着,启动 Android Studio,点击“Open”按钮选择应用工程文件夹,然后点击“OK”。由于下载 Gradle 和各种 Jar 包可能需要一段时间&#x…

以太坊下一阶段的关键——隐私

1. 引言 随着以太坊庆祝其十周年纪念,Aztec Labs 联合创始人兼 CEO Zac Williamson 和以太坊基金会 PSE 负责人 Sam Richards 表示,以太坊必须加强其对隐私的原始承诺。 以太坊庆祝十周年纪念,标志着智能合约、去中心化金融(DeF…

CTFpwn学习笔记1-栈溢出

栈溢出通过写入超出数组定义范围的字符长度达到溢出,从而覆盖栈上其余数据,覆盖返回地址约等于控制程序执行流例如:经过ida反编译后,发现这里要将v2的值修改为11.28125才能获得flag,同时我们可以发现这里使用了gets这个…

使用 Android Studio 中的 Gemini,让 Flutter 开发更便捷

作者 / Flutter 产品经理 Ander Dobo 及 Gemini in Android Studio 产品经理 Sandhya Mohan在 Android Studio 中创建 Android 应用的 Flutter 开发者将迎来一次重大的飞跃: Android Studio 中的 Gemini 已全面支持 Dart 和 Flutter 开发!这意味着您可以直接在您青睐…

Deep Learning_ Foundations and Concepts-Springer (2024)【拜读】前向编码器20章

Diffusion Models 扩散模型 我们已经了解到,构建强大的生成模型的一种有效方法是:先引入一个关于潜在变量z的分布p(z),然后使用深度神经网络将z变换到数据空间x。由于神经网络具有通用性,能够将简单固定的分布转化为关于x的高度灵…

Spring全局异常处理最佳实践

全局异常处理器详解 什么是全局异常处理器? 全局异常处理器是Spring框架提供的统一异常处理机制,用于集中处理应用程序中所有控制器(Controller)层抛出的异常。它的核心价值在于: 统一异常处理:避免在每个C…

STL学习(十一、常用的算数算法和集合算法)

目录 一、常用的算数算法 1.accmulate 2.fill 二、常用的集合算法 1.set_intersection 2.set_union 3.set_difference 一、常用的算数算法 包含头文件为<numeric> 1.accmulate 函数原型 accmulate(iterator beg, iterator end, value) // 计算元素累计和 // …

DeepSort 算法分析详解

DeepSort 算法分析详解 DeepSort 简介 DeepSort (Deep Learning Sort) 是一种基于深度学习的多目标跟踪算法&#xff0c;由 Wojke 等人于 2017 年提出。它是对传统 Sort (Simple Online and Realtime Tracking) 算法的改进&#xff0c;通过引入深度特征提取网络来增强目标关联的…

基于深度学习的医学图像分析:使用Capsule Networks实现医学图像分类

前言 医学图像分析是计算机视觉领域中的一个重要应用&#xff0c;特别是在医学图像分类任务中&#xff0c;深度学习技术已经取得了显著的进展。医学图像分类是指将医学图像分配到预定义的类别中&#xff0c;这对于疾病的早期诊断和治疗具有重要意义。近年来&#xff0c;Capsule…

G9打卡——ACGAN

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 1.导入库及参数 import argparse import os import numpy as npimport torchvision.transforms as transforms from torchvision.utils import save_imagefrom…

应用war/jar包是用TongWeb企业版,还是嵌入版?

在判断应用应该采用TongWeb哪个版本时&#xff0c;存在一种错误的观点&#xff1a;如果应用包是jar包&#xff0c;则需要采用TongWeb嵌入版&#xff1b;如果应用包是war包&#xff0c;则需要采用TongWeb企业版。 正确的判断方法&#xff1a;1. 首先应用为jar包&#xff0c;且符…

Linux ARM 平台 C 语言操作 Excel 文件的常用库与工具汇总(支持 xls 和 xlsx)

在 Linux 或嵌入式 ARM 平台开发中&#xff0c;使用 C 语言操作 Excel 文件是一项常见需求&#xff0c;特别是在工业设备数据采集、日志导出、报表生成等场景。Excel 文件格式复杂&#xff0c;手工解析成本高&#xff0c;因此使用现成的库可以极大简化开发工作。 本文整理了若…

Apache Ignite 集群标识(Cluster ID)和集群标签(Cluster Tag)

这是一个关于 Apache Ignite 集群标识&#xff08;Cluster ID&#xff09;和集群标签&#xff08;Cluster Tag&#xff09; 的重要配置概念。我们来一步步深入理解这段文档的含义&#xff0c;并结合实际场景说明其用途。&#x1f9e9; 一、核心概念&#xff1a;Cluster ID 与 C…