紅酒數據集預處理實戰:缺失值處理的 5 種打開方式,從入門到進階一步到位

在數據分析與建模流程中,缺失值處理是數據預處理階段的關鍵步驟,直接影響后續模型的準確性與穩定性。本文以紅酒數據集為研究對象,詳細介紹如何通過基礎統計方法(均值、中位數、眾數)、完整案例分析(CCA)及機器學習算法(線性回歸、隨機森林)實現缺失值填充,并提供完整代碼實現與結果保存方案,幫助讀者系統化掌握缺失值處理邏輯。

一、項目背景與數據概覽

1.1 數據集介紹

本項目使用的 “紅酒.csv” 數據集包含紅酒的多項理化指標(如酒精含量、酸度、糖分等)、礦物類型標簽及最終質量評分,目標是通過預處理后的數據構建后續質量預測模型。數據中存在部分缺失值,需先進行填充處理。

1.2 核心需求

  • 查看數據基本結構(前 10 行、后 10 行),了解數據分布;
  • 采用 5 種不同方法處理缺失值,確保數據完整性;
  • 拆分訓練集與測試集,按 “訓練集規則填充測試集”(避免數據泄露);
  • 保存處理后的數據集,為后續建模提供輸入。

二、項目環境與依賴庫

首先需安裝并導入以下 Python 庫,核心用于數據讀取、缺失值處理與模型構建:

import pandas as pd  # 數據處理核心庫
from sklearn.model_selection import train_test_split  # 數據集拆分
from sklearn.linear_model import LinearRegression  # 線性回歸模型
from sklearn.ensemble import RandomForestRegressor  # 隨機森林回歸模型

三、數據預處理核心流程

3.1 數據讀取與初步探索

第一步讀取數據并查看基本結構,同時統計缺失值總量,明確后續處理目標:

# 讀取紅酒數據(根據編碼選擇gbk或utf-8)
data = pd.read_csv('紅酒.csv', encoding='gbk')# 查看數據前10行與后10行,了解數據結構
print("===== 數據前10行 =====")
print(data.head(10))
print("\n===== 數據后10行 =====")
print(data.tail(10))# 統計每列缺失值數量
null_total = data.isnull().sum()
print("\n===== 各列缺失值數量 =====")
print(null_total)# 拆分特征與標簽(質量評分為目標變量,礦物類型為類別特征)
x_whole = data.drop(['質量評分'], axis=1)  # 所有特征(含礦物類型)
y_whole = data['質量評分']  # 目標變量:質量評分# 拆分訓練集(75%)與測試集(25%),固定隨機種子確保結果可復現
x_train, x_test, y_train, y_test = train_test_split(x_whole, y_whole, test_size=0.25, random_state=42
)

3.2 缺失值處理方法詳解

為適配不同數據分布場景,本文實現 5 種缺失值處理方法,核心邏輯是 **“按礦物類型分組填充”**(同類紅酒理化指標更相似,填充更精準),且嚴格遵循 “用訓練集規則填充測試集” 原則,避免數據泄露。

所有方法封裝在fill_data.py文件中,下文分模塊解析核心邏輯。

方法 1:完整案例分析(CCA)—— 直接刪除缺失值行

適用于缺失值占比極低的場景,直接保留無缺失值的完整樣本,優點是簡單無偏差,缺點是會損失數據量。

def cca_train_fill(train_data, train_label):"""訓練集CCA填充:刪除含缺失值的行"""# 合并特征與標簽data = pd.concat([train_data, train_label], axis=1).reset_index(drop=True)# 刪除含缺失值的行df_filled = data.dropna()# 返回填充后的特征與標簽return df_filled.drop('礦物類型', axis=1), df_filled['礦物類型']def cca_test_fill(train_data, train_label, test_data, test_label):"""測試集CCA填充:邏輯與訓練集一致,僅處理測試集"""data = pd.concat([test_data, test_label], axis=1).reset_index(drop=True)df_filled = data.dropna()return df_filled.drop('礦物類型', axis=1), df_filled['礦物類型']
方法 2-4:基礎統計填充(均值 / 中位數 / 眾數)
  • 均值填充:適用于數據近似正態分布、無極端值的場景;
  • 中位數填充:適用于數據含極端值(如異常高的酒精含量)的場景,抗干擾性更強;
  • 眾數填充:適用于類別型或離散型特征(如某類礦物類型的紅酒酸度集中在某個值)。

以均值填充為例,核心代碼邏輯如下(中位數、眾數僅需替換mean()median()/mode()):

def mean_train_method(data):"""計算單組數據的均值,用于填充"""fill_values = data.mean()return data.fillna(fill_values)def mean_train_fill(train_data, train_label):"""訓練集均值填充:按礦物類型分組后填充"""data = pd.concat([train_data, train_label], axis=1).reset_index(drop=True)# 按礦物類型(0-3)分組groups = [data[data['礦物類型'] == i] for i in range(4)]# 每組單獨用均值填充filled_groups = [mean_train_method(group) for group in groups]# 合并分組數據df_filled = pd.concat(filled_groups).reset_index(drop=True)return df_filled.drop('礦物類型', axis=1), df_filled['礦物類型']def mean_test_fill(train_data, train_label, test_data, test_label):"""測試集均值填充:用訓練集的分組均值填充測試集"""# 合并訓練集與測試集train_all = pd.concat([train_data, train_label], axis=1).reset_index(drop=True)test_all = pd.concat([test_data, test_label], axis=1).reset_index(drop=True)# 按礦物類型分組,用訓練集分組均值填充測試集filled_test_groups = []for mineral_type in range(4):# 訓練集該類別的均值train_group = train_all[train_all['礦物類型'] == mineral_type]# 測試集該類別數據test_group = test_all[test_all['礦物類型'] == mineral_type]# 用訓練集均值填充測試集filled_test = test_group.fillna(train_group.mean())filled_test_groups.append(filled_test)df_filled = pd.concat(filled_test_groups).reset_index(drop=True)return df_filled.drop('礦物類型', axis=1), df_filled['礦物類型']
方法 5:機器學習填充(線性回歸 / 隨機森林)

適用于特征間存在明顯相關性的場景,通過構建預測模型,用其他特征預測缺失值,填充精度更高。核心邏輯是 **“按缺失值數量從小到大處理”**(先填充缺失少的特征,用已填充的特征預測缺失多的特征)。

以隨機森林填充為例,核心代碼如下:

def rf_train_fill(train_data, train_label):"""訓練集隨機森林填充:用其他特征預測缺失值"""# 合并特征與標簽data = pd.concat([train_data, train_label], axis=1).reset_index(drop=True)train_X = data.drop('礦物類型', axis=1)# 按缺失值數量從小到大排序,確定填充順序null_num = train_X.isnull().sum()null_sorted = null_num.sort_values(ascending=True)filling_features = []  # 存儲已處理的特征(用于構建模型輸入)for feat in null_sorted.index:filling_features.append(feat)# 僅處理含缺失值的特征if null_sorted[feat] == 0:continue# 構建模型:以當前特征為目標變量,其他已處理特征為輸入X = train_X[filling_features].drop(feat, axis=1)  # 輸入特征y = train_X[feat]  # 目標變量(待填充的特征)# 篩選非缺失值樣本作為訓練集,缺失值樣本作為測試集null_rows = train_X[train_X[feat].isnull()].index.tolist()X_train = X.drop(null_rows)y_train = y.drop(null_rows)X_test = X.iloc[null_rows]# 訓練隨機森林模型rf = RandomForestRegressor(n_estimators=100, random_state=42)rf.fit(X_train, y_train)# 預測缺失值并填充y_pred = rf.predict(X_test)train_X.loc[null_rows, feat] = y_predprint(f'完成訓練集「{feat}」列填充')return train_X, data['礦物類型']def rf_test_fill(train_data, train_label, test_data, test_label):"""測試集隨機森林填充:用訓練集訓練的模型邏輯填充測試集"""# 合并訓練集與測試集train_all = pd.concat([train_data, train_label], axis=1).reset_index(drop=True)test_all = pd.concat([test_data, test_label], axis=1).reset_index(drop=True)train_X = train_all.drop('礦物類型', axis=1)test_X = test_all.drop('礦物類型', axis=1)# 按測試集缺失值數量排序,用訓練集規則填充null_num = test_X.isnull().sum()null_sorted = null_num.sort_values(ascending=True)filling_features = []for feat in null_sorted.index:filling_features.append(feat)if null_sorted[feat] == 0:continue# 用訓練集的特征構建模型X_train = train_X[filling_features].drop(feat, axis=1)y_train = train_X[feat]X_test = test_X[filling_features].drop(feat, axis=1)# 篩選測試集缺失值行null_rows = test_X[test_X[feat].isnull()].index.tolist()X_test = X_test.iloc[null_rows]# 訓練模型并預測填充rf = RandomForestRegressor(n_estimators=100, random_state=42)rf.fit(X_train, y_train)y_pred = rf.predict(X_test)test_X.loc[null_rows, feat] = y_predprint(f'完成測試集「{feat}」列填充')return test_X, test_all['礦物類型']

3.3 數據保存與后續使用

填充完成后,需將訓練集與測試集合并為完整 DataFrame,并保存為 Excel 文件,方便后續建模使用。同時對訓練集進行隨機打亂,避免順序對模型訓練的影響:

# 選擇一種填充方法(以CCA為例,其他方法只需替換函數名)
x_train_fill, y_train_fill = fill_data.cca_train_fill(x_train, y_train)
x_test_fill, y_test_fill = fill_data.cca_test_fill(x_train, y_train, x_test, y_test)# 合并特征與標簽,訓練集隨機打亂
data_train = pd.concat([x_train_fill, y_train_fill], axis=1).sample(frac=1, random_state=4)
data_test = pd.concat([x_test_fill, y_test_fill], axis=1)# 保存到本地(需提前創建“數據”文件夾)
data_train.to_excel('./數據/訓練空值刪除填充.xlsx', index=False)
data_test.to_excel('./數據/測試空值刪除填充.xlsx', index=False)
print("數據保存完成!")

四、各方法對比與適用場景

不同缺失值處理方法各有優劣,需根據數據特點選擇,下表為核心對比:

處理方法優點缺點適用場景
CCA(刪除行)簡單無偏差,不引入額外信息損失數據量,樣本代表性下降缺失值占比 < 5%,數據量充足
均值填充計算簡單,保留數據量受極端值影響大數據近似正態分布,無極端值
中位數填充抗極端值,穩定性強未利用特征相關性數據含極端值(如酒精含量異常值)
眾數填充適用于離散型 / 類別型特征不適用于連續型特征離散特征(如某類礦物類型的酸度)
隨機森林填充利用特征相關性,填充精度高計算復雜,需調參特征間相關性強,數據量中等

五、總結與后續優化方向

5.1 項目總結

本項目以紅酒數據集為載體,完整實現了從 “數據探索→缺失值處理→結果保存” 的預處理流程,核心亮點:

  1. 嚴格遵循 “訓練集規則填充測試集”,避免數據泄露;
  2. 按 “礦物類型分組填充”,貼合紅酒數據的業務邏輯;
  3. 覆蓋基礎到進階的 5 種方法,適配不同數據場景。

5.2 后續優化方向

  1. 填充效果評估:可通過 “插入人工缺失值” 的方式,對比不同方法的填充誤差(如 MAE、RMSE);
  2. 特征標準化:在機器學習填充前對特征進行標準化(如StandardScaler),提升模型預測精度;
  3. 分類任務適配:若目標是 “紅酒質量分級”(如好 / 中 / 差),可將隨機森林回歸改為分類器(RandomForestClassifier)。

通過本文的方法,可快速完成紅酒數據集的缺失值處理,為后續的質量預測模型(如線性回歸、隨機森林、SVM)提供高質量的輸入數據。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94239.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94239.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94239.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Node.js 開發 JavaScript SDK 包的完整指南(AI)

一、核心概念SDK 包定義 專為特定服務/平臺封裝的工具庫&#xff0c;提供標準化 API 調用、錯誤處理、類型聲明等功能。示例&#xff1a;支付寶 SDK、AWS SDK、微信小程序 SDK。技術棧選擇 語言&#xff1a;JavaScript/TypeScript&#xff08;推薦 TS&#xff0c;便于類型提示&…

Redis實戰-基于Session實現分布式登錄

1.流程分析1.1發送短信驗證碼提交手機號的時候要進行校驗手機號&#xff0c;校驗成功才會去生成驗證碼&#xff0c;將驗證碼保存到session&#xff0c;發生他把這部分那。1.2短信驗證碼登錄/注冊如果提交手機號和驗證碼之后&#xff0c;校驗一致才進行根據手機號查詢用戶&#…

瘋狂星期四文案網第47天運營日記

網站運營第47天&#xff0c;點擊觀站&#xff1a; 瘋狂星期四 crazy-thursday.com 全網最全的瘋狂星期四文案網站 運營報告 今日訪問量 今日搜索引擎收錄情況 必應現在是邊收錄邊k頁面 百度快倒閉 網站優化點 完善工作流&#xff0c;全面實現文案自動化采集&#xff0c;se…

Vue生命周期以及自定義鉤子和路由

Vue生命周期常用的onMounted掛載后執行和onUnmounted卸載前以及onupdated更新后實際上用react對比就是useEffect&#xff0c;而且掛載順序也是子組件先于父組件然后往外的棧結構&#xff0c;先進后出。1.Vue的生命周期<template><h2>當前求和為{{ sum }}</h2>…

探索Thompson Shell:Unix初代Shell的智慧

引言 在計算機科學的漫漫長河中&#xff0c;Thompson Shell 無疑占據著舉足輕重的開創性地位&#xff0c;它是 Unix 系統的第一個 shell&#xff0c;誕生于 1971 年&#xff0c;由計算機領域的傳奇人物 Ken Thompson 開發。在那個計算機技術剛剛起步、硬件資源極度匱乏的年代&a…

MySQL B+ 樹索引詳解:從原理到實戰優化

引言在現代數據庫應用中&#xff0c;查詢效率是影響系統性能的關鍵因素之一。而索引&#xff0c;尤其是 B 樹索引&#xff0c;是 MySQL 中最常用、最重要的性能優化手段。正確使用索引可以將查詢時間從毫秒級降低到微秒級&#xff0c;極大地提升應用響應速度。1. B 樹索引的重要…

計算機內存中的整型存儲奧秘、大小端字節序及其判斷方法

目錄 一、回顧與引入&#xff1a;整數在內存中的存儲方式 為什么要采用補碼存儲&#xff1f; 二、大小端字節序及其判斷方法 1、什么是大小端&#xff1f; 2、為什么存在大小端&#xff1f; 3、練習 練習1&#xff1a;簡述大小端概念并設計判斷程序&#xff08;百度面試…

Redis 最常用的 5 種數據類型

Redis 支持多種靈活的數據類型&#xff0c;每種類型針對特定場景優化。以下是 **Redis 最常用的 5 種數據類型**及其核心特點和應用場景&#xff1a;1. 字符串&#xff08;String&#xff09;描述&#xff1a;最基本的數據類型&#xff0c;可存儲文本、數字&#xff08;整數/浮…

【嵌入式】RK3588 對比 NVIDIA Jetson,Radxa Rock 5B vs Orange Pi 5 Max

RK3588這個芯片,適合AI應用么,為什么這么貴呢 AI 邊緣盒子里的旗艦芯 深度分析一下 RK3588(瑞芯微 Rockchip RK3588) 為什么被很多人關注在 AI 應用,以及它價格偏高的原因。 ?? 1. RK3588 的基本情況 制程:8nm(Samsung 8nm LP) CPU:8 核 big.LITTLE 架構(4 Cortex-…

暴雨讓高性能計算更“冷靜”

當AI大模型的參數突破萬億&#xff0c;當深地探測的精度邁向微米&#xff0c;當數字經濟的脈搏與千行百業深度共振&#xff0c;算力已成為驅動時代向前的核心引擎。然而&#xff0c;傳統風冷技術在高密度算力需求面前漸顯乏力——機柜內的熱浪如同無形的枷鎖&#xff0c;既制約…

SpringAI集成MCP

文章目錄1_調用公用MCP2_Stdio方式3_Stdio實現原理4_SSE方式5_自定義MCP客戶端6_MCP Server權限控制SpringAI 通過 SpringBoot 集成擴展了 MCP Java SDK &#xff0c;提供了客戶端和服務端 starter&#xff0c;讓 AI 應用程序快速支持 MCP。接下來直接演示。 1_調用公用MCP 在…

Spring Start Here 讀書筆記:第10章 Implementing REST services

REST 服務可用于實現兩個應用之間的通訊&#xff0c;包括 Web 應用中的客戶端和服務器之間&#xff0c;移動應用與后端服務之間&#xff0c;或兩個后端服務之間。 10.1 使用 REST 服務在應用之間交換數據 REST端點是應用程序通過 Web 協議公開服務的方式&#xff0c;因此也稱…

SYBASE ASE、Oracle、MySQL/MariaDB、SQL Server及PostgreSQL在郵件/短信發送功能上的全面橫向對比報告

以下是對SYBASE ASE、Oracle、MySQL/MariaDB、SQL Server及PostgreSQL在郵件/短信發送功能上的全面橫向對比報告&#xff08;截至2025年8月最新版本&#xff09;&#xff0c;涵蓋技術實現、配置復雜度、適用場景及權威評測&#xff1a;??一、郵件發送能力對比????1. Orac…

服務器與客戶端

目錄 一、服務器&#xff08;Server&#xff09; 核心特點 常見類型 二、客戶端&#xff08;Client&#xff09; 核心特點 常見類型 客戶端與服務器的交互流程 補充&#xff1a;與 “對等網絡&#xff08;P2P&#xff09;” 的區別 C/S模式 一、C/S 模式的核心原理 …

GaussDB 并發自治事務數達到最大值處理案例

1 業務背景自治事務&#xff08;Autonomous Transactions&#xff09;是一種高級特性&#xff0c;允許你在一個事務中執行另一個獨立的事務。這種機制特別有用&#xff0c;尤其是在需要在一個事務中執行多個操作但又不想因為其中一個操作失敗而影響整個事務的場景。2 業務影響在…

【傳奇開心果系列】Flet分頁自定義組件CustomPaginationComponent封裝版自定義模板

Flet分頁自定義組件CustomPaginationComponent封裝版自定義模板一、效果展示GIF動圖二、應用場景三、特色說明四、源碼下載地址一、效果展示GIF動圖 二、應用場景 圖片瀏覽應用&#xff1a; 用戶可以通過分頁組件瀏覽多張圖片&#xff0c;每點擊一次“上一頁”或“下一頁”按鈕…

數據安全——39頁解讀數字化轉型大數據安全基礎培訓方案【附全文閱讀】

適應人群為企業數據安全管理人員、IT 運維人員、數字化轉型決策者、網絡安全工程師及關注大數據安全的從業人員。主要內容圍繞數字化轉型中大數據安全展開,核心包括基礎概念(信息、數據與大數據的定義及區別,大數據 4V 特點與來源);安全風險(企業面臨的數據資產管理缺失、…

week3-[二維數組]小方塊

week3-[二維數組]小方塊 題目描述 如果四個數 a,b,c,da,b,c,da,b,c,d 可以分成兩組&#xff0c;每組兩個數&#xff0c;滿足每組里面的兩個數一樣&#xff0c;那么稱這四個數是好的。 比如&#xff0c;2,5,2,52,5,2,52,5,2,5 是好的&#xff0c;因它滿足兩組&#xff1a;222 與…

Swift 項目結構詳解:構建可維護的大型應用

Swift 項目結構詳解&#xff1a;構建可維護的大型應用一、基礎結構&#xff08;推薦新手使用&#xff09;二、組件化結構&#xff08;企業級應用推薦&#xff09;層級架構&#xff1a;MVVM Coordinator路由實現&#xff08;Coordinator模式&#xff09;三、通用組件實現DI&…

【實時Linux實戰系列】基于實時Linux的數字轉換器設計

在現代電子系統中&#xff0c;數字轉換器&#xff08;如模數轉換器ADC和數模轉換器DAC&#xff09;扮演著至關重要的角色。它們負責將模擬信號轉換為數字信號&#xff0c;或將數字信號轉換為模擬信號&#xff0c;從而實現信號的數字化處理和傳輸。在實時系統中&#xff0c;如工…