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

目录

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,一经查实,立即删除!

相关文章

赛博解压板

目录 开头程序程序的流程图程序的解压效果(暂无,但可以运行一下上面的代码)结尾 开头 大家好,我叫这是我58。今天,我们要看关于赛博解压板的一些东西。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #define ROW 6//ROW表示行数,可…

【ARM 常见汇编指令学习 7.1 -- LDRH 半字读取指令】

请阅读【嵌入式开发学习必备专栏】 文章目录 LDRH 使用介绍LDRH(Load Register Half-word)总结 LDRH 使用介绍 在ARMv9架构中,汇编指令LDRH用于从内存中载入数据到寄存器的指令,下面将分别对它进行详细介绍: LDRH&am…

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

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

【WebKit屏幕方向API全解析】掌握现代Web应用的方向感应

标题:【WebKit屏幕方向API全解析】掌握现代Web应用的方向感应 WebKit作为许多现代浏览器的内核,提供了对HTML5和CSS3的广泛支持,包括对屏幕方向的控制。屏幕方向API(Screen Orientation API)允许Web应用知道屏幕的方向…

左耳听风_114_113_Go编程模式修饰器

你好,我是陈浩,我名多尔多house.之前呢我写过一篇文章叫做python修饰器的函数式编程。 那这种模式呢可以很轻松的把一些函数啊装配到另外一些函数上。 让你的代码呢更加简单,也可以让一些小功能性的代码复用性更高。 让代码中的函数呢可以…

掌握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的开关…

代码随想录算法训练营第3天|LeetCode

203.移除链表元素 题目链接:203. 移除链表元素 - 力扣(LeetCode) 文档链接:代码随想录 (programmercarl.com) 视频链接:手把手带你学会操作链表 | LeetCode:203.移除链表元素_哔哩哔哩_bilibili 第一想法 …

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文件 终端输…

《知识点扫盲 · 监听器 Listener》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…

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

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

批量注册工具是什么

摘要:批量注册工具作为自动化领域的一个分支,为用户在多平台账号管理中提供了极大的便利。 关键词 批量注册,自动化,实战代码,设计原则,法律法规 1. 引言 批量注册工具能够在短时间内创建大量账号&…