通透!手把教你如何從頭構建一個機器學習模型

目錄

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.pswp.cn/web/40404.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40404.shtml
英文地址,請注明出處:http://en.pswp.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. 引言 批量注冊工具能夠在短時間內創建大量賬號&…