通透!手把教你如何从头构建一个机器学习模型

目录

1.业务理解

2.数据收集和准备

数据采集

探索性数据分析 (EDA) 和数据清理

特征选择

3.建立机器学习模型

选择正确的模型

分割数据

训练模型

模型评估

4.模型优化

5.部署模型


今天我将带领大家一步步的来构建一个机器学习模型。

我们将按照以下步骤开发客户流失预测分类模型。

文末福利:拉到最后

包含:Java、云原生、GO语音、嵌入式、Linux、物联网、AI人工智能、python、C/C++/C#、软件测试、网络安全、Web前端、网页、大数据、Android大模型多线程、JVM、Spring、MySQL、Redis、Dubbo、中间件…等最全厂牌最新视频教程+源码+软件包+面试必考题和答案详解。

1.业务理解

在开发任何机器学习模型之前,我们必须了解为什么要开发该模型。

这里,我们以客户流失预测为例。

在这种情况下,企业需要避免公司进一步流失,并希望对流失概率高的客户采取行动。有了上述业务需求,所以需要开发一个客户流失预测模型。

2.数据收集和准备
数据采集

数据是任何机器学习项目的核心。没有数据,我们就无法训练机器学习模型。

在现实情况下,干净的数据并不容易获得。通常,我们需要通过应用程序、调查和许多其他来源收集数据,然后将其存储在数据存储中。

在我们的案例中,我们将使用来自 Kaggle 的电信客户流失数据。它是有关电信行业客户历史的开源分类数据,带有流失标签。

https://www.kaggle.com/datasets/blastchar/telco-customer-churn

探索性数据分析 (EDA) 和数据清理

首先,我们加载数据集。

import pandas as pddf = pd.read_csv('WA_Fn-UseC_-Telco-Customer-Churn.csv')
df.head()

接下来,我们将探索数据以了解我们的数据集。

以下是我们将为 EDA 流程执行的一些操作。

  1. 检查特征和汇总统计数据。

  2. 检查特征中是否存在缺失值。

  3. 分析标签的分布(流失)。

  4. 为数值特征绘制直方图,为分类特征绘制条形图。

  5. 为数值特征绘制相关热图。

  6. 使用箱线图识别分布和潜在异常值。

首先,我们将检查特征和汇总统计数据。

df.info()

图片

df.describe()df.describe(exclude = 'number')

图片

让我们检查一下缺失的数据。

df.isnull().sum()

可以看到,数据集不包含缺失数据,因此我们不需要执行任何缺失数据处理活动。

然后,我们将检查目标变量以查看是否存在不平衡情况。

df['Churn'].value_counts()

图片

存在轻微的不平衡,因为与无客户流失的情况相比,只有接近 25% 的客户流失发生。

让我们再看看其他特征的分布情况,从数字特征开始。

 

import numpy as np
df['TotalCharges'] = df['TotalCharges'].replace('', np.nan)
df['TotalCharges'] = pd.to_numeric(df['TotalCharges'], errors='coerce').fillna(0)

df['SeniorCitizen'] = df['SeniorCitizen'].astype('str')

df['ChurnTarget'] = df['Churn'].apply(lambda x: 1 if x=='Yes' else 0)

num_features = df.select_dtypes('number').columns
df[num_features].hist(bins=15, figsize=(15, 6), layout=(2, 5))

图片

我们还将提供除 customerID 之外的分类特征绘图。

 

import matplotlib.pyplot as plt
# Plot distribution of categorical features
cat_features = df.drop('customerID', axis =1).select_dtypes(include='object').columns

plt.figure(figsize=(20, 20))
for i, col in enumerate(cat_features, 1):
    plt.subplot(5, 4, i)
    df[col].value_counts().plot(kind='bar')
    plt.title(col)

图片

然后我们将通过以下代码看到数值特征之间的相关性。

import seaborn as sns# Plot correlations between numerical features
plt.figure(figsize=(10, 8))
sns.heatmap(df[num_features].corr())
plt.title('Correlation Heatmap')

图片

最后,我们将使用基于四分位距(IQR)的箱线图检查数值异常值。

# Plot box plots to identify outliers
plt.figure(figsize=(20, 15))
for i, col in enumerate(num_features, 1):plt.subplot(4, 4, i)sns.boxplot(y=df[col])plt.title(col)

图片

从上面的分析中,我们可以看出,我们不应该解决缺失数据或异常值的问题。

下一步是对我们的机器学习模型进行特征选择,因为我们只想要那些影响预测且在业务中可行的特征。

特征选择

特征选择的方法有很多种,通常结合业务知识和技术应用来完成。

但是,本教程将仅使用我们之前做过的相关性分析来进行特征选择。

首先,让我们根据相关性分析选择数值特征。

target = 'ChurnTarget'
num_features = df.select_dtypes(include=[np.number]).columns.drop(target)# Calculate correlations
correlations = df[num_features].corrwith(df[target])# Set a threshold for feature selection
threshold = 0.3
selected_num_features = correlations[abs(correlations) > threshold].index.tolist()
selected_cat_features=cat_features[:-1]selected_features = []
selected_features.extend(selected_num_features)
selected_features.extend(selected_cat_features)
selected_features

你可以稍后尝试调整阈值,看看特征选择是否会影响模型的性能。

3.建立机器学习模型
选择正确的模型

选择合适的机器学习模型需要考虑很多因素,但始终取决于业务需求。

以下几点需要记住:

  1. 用例问题。它是监督式的还是无监督式的?是分类式的还是回归式的?用例问题将决定可以使用哪种模型。

  2. 数据特征。它是表格数据、文本还是图像?数据集大小是大还是小?根据数据集的不同,我们选择的模型可能会有所不同。

  3. 模型的解释难度如何?平衡可解释性和性能对于业务至关重要。

经验法则是,在开始复杂模型之前,最好先以较简单的模型作为基准。

对于本教程,我们从逻辑回归开始进行模型开发。

分割数据

下一步是将数据拆分为训练、测试和验证集。

from sklearn.model_selection import train_test_splittarget = 'ChurnTarget' X = df[selected_features]
y = df[target]cat_features = X.select_dtypes(include=['object']).columns.tolist()
num_features = X.select_dtypes(include=['number']).columns.tolist()#Splitting data into Train, Validation, and Test Set
X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42, stratify=y)X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.25, random_state=42, stratify=y_train_val)

在上面的代码中,我们将数据分成 60% 的训练数据集和 20% 的测试和验证集。

一旦我们有了数据集,我们就可以训练模型。

训练模型

如上所述,我们将使用训练数据训练 Logistic 回归模型。

from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder
from sklearn.linear_model import LogisticRegressionpreprocessor = ColumnTransformer(transformers=[('num', 'passthrough', num_features),('cat', OneHotEncoder(), cat_features)])pipeline = Pipeline(steps=[('preprocessor', preprocessor),('classifier', LogisticRegression(max_iter=1000))
])# Train the logistic regression model
pipeline.fit(X_train, y_train)
模型评估

以下代码显示了所有基本分类指标。

from sklearn.metrics import classification_report# Evaluate on the validation set
y_val_pred = pipeline.predict(X_val)
print("Validation Classification Report:\n", classification_report(y_val, y_val_pred))# Evaluate on the test set
y_test_pred = pipeline.predict(X_test)
print("Test Classification Report:\n", classification_report(y_test, y_test_pred))

从验证和测试数据中我们可以看出,流失率(1) 的召回率并不是最好的。这就是为什么我们可以优化模型以获得最佳结果。

图片

4.模型优化

优化模型的一种方法是通过超参数优化,它会测试这些模型超参数的所有组合,以根据指标找到最佳组合。

每个模型都有一组超参数,我们可以在训练之前设置它们。

from sklearn.model_selection import GridSearchCV
# Define the logistic regression model within a pipeline
pipeline = Pipeline(steps=[('preprocessor', preprocessor),('classifier', LogisticRegression(max_iter=1000))
])# Define the hyperparameters for GridSearchCV
param_grid = {'classifier__C': [0.1, 1, 10, 100],'classifier__solver': ['lbfgs', 'liblinear']
}# Perform Grid Search with cross-validation
grid_search = GridSearchCV(pipeline, param_grid, cv=5, scoring='recall')
grid_search.fit(X_train, y_train)# Best hyperparameters
print("Best Hyperparameters:", grid_search.best_params_)# Evaluate on the validation set
y_val_pred = grid_search.predict(X_val)
print("Validation Classification Report:\n", classification_report(y_val, y_val_pred))# Evaluate on the test set
y_test_pred = grid_search.predict(X_test)
print("Test Classification Report:\n", classification_report(y_test, y_test_pred))

图片

5.部署模型

我们已经构建了机器学习模型。有了模型之后,下一步就是将其部署到生产中。让我们使用一个简单的 API 来模拟它。

首先,让我们再次开发我们的模型并将其保存为 joblib 对象。

import joblibbest_params = {'classifier__C': 10, 'classifier__solver': 'liblinear'}
logreg_model = LogisticRegression(C=best_params['classifier__C'], solver=best_params['classifier__solver'], max_iter=1000)preprocessor = ColumnTransformer(transformers=[('num', 'passthrough', num_features),('cat', OneHotEncoder(), cat_features)])pipeline = Pipeline(steps=[('preprocessor', preprocessor),('classifier', logreg_model)
])pipeline.fit(X_train, y_train)# Save the model
joblib.dump(pipeline, 'logreg_model.joblib')

一旦模型对象准备就绪,我们将创建一个名为 app.py 的 Python 脚本,并将以下代码放入脚本中。

from fastapi import FastAPI
from pydantic import BaseModel
import joblib
import numpy as np# Load the logistic regression model pipeline
model = joblib.load('logreg_model.joblib')# Define the input data for model
class CustomerData(BaseModel):tenure: intInternetService: strOnlineSecurity: strTechSupport: strContract: strPaymentMethod: str# Create FastAPI app
app = FastAPI()# Define prediction endpoint
@app.post("/predict")
def predict(data: CustomerData):input_data = {'tenure': [data.tenure],'InternetService': [data.InternetService],'OnlineSecurity': [data.OnlineSecurity],'TechSupport': [data.TechSupport],'Contract': [data.Contract],'PaymentMethod': [data.PaymentMethod]}import pandas as pdinput_df = pd.DataFrame(input_data)# Make a predictionprediction = model.predict(input_df)# Return the predictionreturn {"prediction": int(prediction[0])}if __name__ == "__main__":import uvicornuvicorn.run(app, host="0.0.0.0", port=8000)

在命令提示符或终端中,运行以下代码。

uvicorn app:app --reload

有了上面的代码,我们已经有一个用于接受数据和创建预测的 API。

让我们在新终端中使用以下代码尝试一下。

curl -X POST "http://127.0.0.1:8000/predict" -H "Content-Type: application/json" -d "{\"tenure\": 72, \"InternetService\": \"Fiber optic\", \"OnlineSecurity\": \"Yes\", \"TechSupport\": \"Yes\", \"Contract\": \"Two year\", \"PaymentMethod\": \"Credit card (automatic)\"}"

如你所见,API 结果是一个预测值为 0(Not-Churn)的字典。你可以进一步调整代码以获得所需的结果。

最后福利:


包含:Java、云原生、GO语音、嵌入式、Linux、物联网、AI人工智能、python、C/C++/C#、软件测试、网络安全、Web前端、网页、大数据、Android大模型多线程、JVM、Spring、MySQL、Redis、Dubbo、中间件…等最全厂牌最新视频教程+源码+软件包+面试必考题和答案详解。
 

关注公众号:资源充电吧


点击小卡片关注下,回复:学习

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

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

相关文章

【基础算法】UE中实现轮播

本期作者:尼克 易知微3D引擎技术负责人 当前N 总数M 从0到M-1 从1到M 感谢阅读,以上内容均由易知微3D引擎团队原创设计,以及易知微版权所有,转载请注明出处,违者必究,谢谢您的合作。申请转载授权后台回复【…

掌握XD数字设计:打造令人惊艳的用户体验

xd是adobe旗下一款主打UI界面设计-建立原型的软件,它可以将wireframe、design、以及prototype等UI/UX设计流程整合到一个软件中,算是一款与sketch对打的软件。 与PS相比,在UI设计方面,Adobe XD有非常突出的3个优点:能…

从0到1手写vue源码

模版引擎 数组join法(字符串) es6反引号法(模版字符串换行) mustache (小胡子) 引入mustache 模版引擎的使用 mustache.render(templatestr,data) mustache.render 循环简单数组 循环复杂数组 循环单项数组 数组的嵌套 musta…

江苏徐州SAP代理商有哪些?怎么选择?

在数字化浪潮席卷全球的今天,企业对于高效、智能的管理系统需求日益迫切。SAP作为全球领先的企业管理软件解决方案提供商,其产品在市场上享有极高的声誉。而在江苏徐州,哲讯智能科技作为SAP的代理商,以其专业的技术实力和优质的服…

开源205W桌面充电器,140W+65W升降压PD3.1快充模块(2C+1A口),IP6557+IP6538

开源一个基于IP6557和IP6538芯片的205W升降压快充模块(140W65W),其中一路C口支持PD3.1协议,最高输出28V5A,另一路是A口C口,最高输出65W(20V3.25A),可搭配一个24V10A的开关…

SpringBoot-第一天学习

SpringBoot介绍-约定大于配置 SpringBoot是在Spring4.0基础上开发的,不是替代Spring的解决方案,而是和Spring框架结合并进一步简化Spring搭建和开发过程的。 如何简化?就是通过提供默认配置等方式让我们更容易,集成了大量常用的…

交叉测试的优点和缺点!

交叉测试在软件测试中具有重要的地位和作用。通过交叉测试,可以提高软件质量、提升用户体验、增加测试覆盖率、提高测试效率以及满足市场需求和竞争优势。因此,在软件开发和测试过程中,应充分重视交叉测试的实施和应用。 以下是对其优缺点的…

推荐3款Windows系统的神级软件,免费、轻量、绝对好用!

DiskView DiskView是一款用于管理和查看磁盘空间的工具,它集成了于微软的Windows操作系统资源管理器中,以显示直观的磁盘空间使用情况。该软件通过生成图形化地图,帮助用户组织和管理大量文件和文件夹,从而高效地管理磁盘空间。用…

JDBC 学习笔记+代码整理

Tip Idea自带可视界面👉MySQL 图形化界面-CSDN博客 Idea2022无add Framework support选项👉最新版IDEA:Add web Framework Support步骤/构建JavaWeb项目步骤_idea add framework support-CSDN博客 基本步骤 1.加载驱动包Driver 2.建立与数据库的连接C…

证券交易系统中服务器监控系统功能设计

1.背景介绍 此服务器监控系统的目的在于提高行情服务器的监管效率,因目前的的行情服务器,包括DM、DT、DS配置数量较多,巡回维护耗时较多,当行情服务器出现异常故障,或者因为网络问题造成数据断线等情况时,监…

芯科普| 矽光子是什麼?可以用在哪些领域?点击查看!

随着生成式人工智能的崛起,数据传输需求亦呈现爆发式增长。而在此背景下,台积电在半导体展览上披露的硅光子(SiPh:Silicon Photonics)技术进展,更是将硅光子推向了风口浪尖,成为了市场的宠儿。 …

IDEA导入依赖+Maven配置

Maven安装及配置 安装 安装链接:https://archive.apache.org/dist/maven/maven-3/3.6.3/binaries/ 注:建议不要直接安装最新版本,选用常用、稳定的版本安装即可,比如:3.6.3 配置 1> 配置bash_profile文件 终端输…

高效前端开发:解密pnpm的存储与链接

什么是pnpm PNPM(Performant NPM)是一种快速且节省磁盘空间的包管理工具。相较于其他包管理器如NPM和Yarn,PNPM通过独特的存储机制和链接技术解决了许多常见的问题。以下是PNPM如何避免这些问题以及其关键技术的详细介绍。 特性 PNPM Store…

【MySQL备份】Percona XtraBackup总结篇

目录 1.前言 2.问题总结 2.1.为什么在恢复备份前需要准备备份 2.1.1. 保证数据一致性 2.1.2. 完成崩溃恢复过程 2.1.3. 解决非锁定备份的特殊需求 2.1.4. 支持增量和差异备份 2.1.5. 优化恢复性能 2.2.Percona XtraBackup的工作原理 3.注意事项 1.前言 在历经了详尽…

数据库、创建表、修改表

一、数据库 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 二、创建表 1、创建一个名称为db_system的数据库 2、在该数据库下创建两张表,具体要求如下 员工表 user…

图像的对数变换

对数变换在图像处理中通常有以下作用: 因为对数曲线在像素值较低的区域斜率较大,像素值较高的区域斜率比较低,所以图像经过对数变换之后,在较暗的区域对比度将得到提升,因而能增强图像暗部的细节。图像的傅里叶频谱其…

Python函数语法详解(与C++对比学习)【未完】

一、Python函数的形式 def function_name (参数, ...) -> return value_type:# 函数体return value# 看具体需求# 如果没有return语句,函数执行完毕后也会返回结果# 只是结果为None。return None可以简写为return 1. Python的返回值 在Python3中,提…

利用Redis bitmap 实现签到案例

数据库实现 设计签到功能对应的数据库表 CREATE TABLE sign_record (id bigint NOT NULL AUTO_INCREMENT COMMENT 主键,user_id bigint NOT NULL COMMENT 用户id,year year NOT NULL COMMENT 签到年份,month tinyint NOT NULL COMMENT 签到月份,date date NOT NULL COMMENT 签…

在Linux操作系统中关于逻辑卷的案例

1.如何去创建一个逻辑卷 1.1先去创建物理卷 如上图所示,physical volume 物理卷 被成功创建。 如上图所示,可以使用pvscan来去查看当前Linux操作系统的物理卷/ 1.2使用创建好的物理卷去创建一个卷组。 如上图所示,可以使用第一步创建的两个…

【中项第三版】系统集成项目管理工程师 | 第 9 章 项目管理概论③ | 9.6 - 9.10

前言 第 9 章对应的内容选择题和案例分析都会进行考查,这一章节理论性较强,学习要以教材为准。本章分值预计在4-5分。 目录 9.6 项目管理过程组 9.7 项目管理原则 9.8 项目管理知识领域 9.9 价值交付系统 9.10 本章练习 9.6 项目管理过程组 项目…