礦物分類案列 (一)六種方法對數據的填充

目錄

礦物數據項目介紹:

數據問題與處理方案:

數據填充策略討論:

模型選擇與任務類型:

模型訓練計劃:

一.數據集填充

1.讀取數據

2.把標簽轉化為數值

3.把異常數據轉化為nan

4.數據Z標準化

5.劃分訓練集測試集

6.創建一個新的fill_data.py文件,用來存放填充訓練數據和填充測試數據的方法

方法①:刪除有缺失值的行

方法②:平均值填充處理(測試集用訓練集對應的平均值來填充)

方法③:中位數填充處理(測試集用訓練集對應的中位數來填充)

方法④:眾數填充處理(測試集用訓練集對應的眾數來填充)

7.調用填充方法,生成各自方法填充后的數據,并保存到各自的excel文件中


礦物數據項目介紹:

數據類型:每行記錄礦物微量元素(氯、鈉、鎂等)及類別(A/B/C/D/E)(注意:發現類別 E 僅有一條數據,無法用于模型訓練,所以我們應該刪除該數據)

任務目標:構建分類模型,通過微量元素自動識別礦物類型(A/B/C/D)

數據問題與處理方案:

異常值:如“7.97”(應為7.97)、“41.12”(應為41.12)等輸入錯誤,需手動修正。
缺失值填充:
方法A:按類別分組填充(如A類用A類均值/眾數/中位數)。
方法B:智能填充(如邏輯回歸、隨機森林等算法預測缺失值)。
特征工程:特征數量較少(約10個),無需降維。

發現數據中存在隱藏空格(如“思”列),導致NaN檢測失敗,需手動清理空格干擾。
其他問題:斜杠(如PH值列)、單一類別數據列(如“異”列)需刪除或特殊處理。

數據填充策略討論:

優先填充缺失值最少的列(如F列僅缺3個值),以增加完整數據量,便于后續預測其他列(如K列)。
填充順序:從缺失少的列到缺失多的列,以提高填充準確性。
強調利用已有數據(包括部分缺失的數據)進行訓練,而非僅依賴完全完整的數據。

模型選擇與任務類型:

確定當前任務為回歸問題(因預測目標Y為連續型數據)。
可用回歸模型包括:SVR(SVM變體)、KNN、隨機森林、線性回歸等。

模型訓練計劃:

多模型對比:嘗試邏輯回歸、隨機森林、支持向量機、XGBoost等,調參后評估效果(準確率、召回率等)。
步驟:
數據預處理(清洗、填充缺失值)。
分模型訓練與調參(交叉驗證)。
生成對比表格,選擇最優模型。

=========================================================================

下面我們先用四種方法來填充數據分別是刪除空白數據行處理,平均值填充處理,中位數填充處理,眾數填充處理

一.數據集填充

部分數據如下

1.讀取數據

刪除僅有一行數據的‘E’類數據,并刪除無關列‘序號’

import pandas as pd
data=pd.read_excel('礦物數據.xlsx')
data=data[data['礦物類型']!='E']
data=data.drop('序號',axis=1)
x_whole=data.iloc[:,:-1]
y_whole=data.iloc[:,-1]

2.把標簽轉化為數值

把礦物類型A,B,C,D類轉化成機器可讀的數字1,2,3,4

labels_dict={'A':1,'B':2,'C':3,'D':4}
en_labels=[labels_dict[label] for label in data['礦物類型']]
y_whole=pd.Series(en_labels,name='礦物類型')

3.把異常數據轉化為nan

用pandas庫將可以轉化為數字類型的數據轉化為數字,不能轉化的數據寫為nan

# 異常數據轉化為nan
for column_name in x_whole.columns:x_whole[column_name]=pd.to_numeric(x_whole[column_name],errors='coerce')

4.數據Z標準化

#對數據Z標準化
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_whole_Z=scaler.fit_transform(x_whole)
X_whole_Z=pd.DataFrame(X_whole_Z,columns=x_whole.columns)

5.劃分訓練集測試集

from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(X_whole_Z,y_whole)

6.創建一個新的fill_data.py文件,用來存放填充訓練數據和填充測試數據的方法

方法①:刪除有缺失值的行

import pandas as pd
#只保留完整數據集
def cca_train_fill(x_train,y_train):data=pd.concat([x_train,y_train],axis=1)data=data.reset_index(drop=True)data=data.dropna()return data.iloc[:,:-1],data.iloc[:,-1]
def cca_test_fill(x_test,y_test):data=pd.concat([x_test,y_test],axis=1)data=data.reset_index(drop=True)data=data.dropna()return data.iloc[:,:-1],data.iloc[:,-1]

方法②:平均值填充處理(測試集用訓練集對應的平均值來填充)

由于每一類的平均值都要分開處理所以我們先將每一類分別提取出來

def mean_train_fill(x_train,y_train):data=pd.concat([x_train,y_train],axis=1)data=data.reset_index(drop=True)A=data[data['礦物類型']==1]B=data[data['礦物類型']==2]C=data[data['礦物類型']==3]D=data[data['礦物類型']==4]A=mean_method_train(A)B=mean_method_train(B)C=mean_method_train(C)D=mean_method_train(D)data=pd.concat([A,B,C,D])return data.drop('礦物類型',axis=1),data['礦物類型']
def mean_test_fill(x_train,y_train,x_test,y_test):data_train = pd.concat([x_train, y_train], axis=1)data_train = data_train.reset_index(drop=True)A_train = data_train[data_train['礦物類型'] == 1]B_train = data_train[data_train['礦物類型'] == 2]C_train = data_train[data_train['礦物類型'] == 3]D_train = data_train[data_train['礦物類型'] == 4]data_test = pd.concat([x_test, y_test], axis=1)data_test = data_test.reset_index(drop=True)A_test = data_test[data_test['礦物類型'] == 1]B_test = data_test[data_test['礦物類型'] == 2]C_test = data_test[data_test['礦物類型'] == 3]D_test = data_test[data_test['礦物類型'] == 4]A_test=mean_method_test(A_train,A_test)B_test = mean_method_test(B_train, B_test)C_test = mean_method_test(C_train,C_test)D_test = mean_method_test(D_train, D_test)data = pd.concat([A_test, B_test, C_test, D_test])return data.drop('礦物類型', axis=1), data['礦物類型']def mean_method_train(data):fill_values=data.mean()data=data.fillna(fill_values)return data
def mean_method_test(train_data,test_data):fill_values=train_data.mean()test_data=test_data.fillna(fill_values)return test_data

方法③:中位數填充處理(測試集用訓練集對應的中位數來填充)

def median_train_fill(x_train,y_train):data = pd.concat([x_train, y_train], axis=1)data = data.reset_index(drop=True)A = data[data['礦物類型'] == 1]B = data[data['礦物類型'] == 2]C = data[data['礦物類型'] == 3]D = data[data['礦物類型'] == 4]A = median_method_train(A)B = median_method_train(B)C = median_method_train(C)D = median_method_train(D)data = pd.concat([A, B, C, D])return data.drop('礦物類型', axis=1), data['礦物類型']
def median_test_fill(x_train,y_train,x_test,y_test):data_train = pd.concat([x_train, y_train], axis=1)data_train = data_train.reset_index(drop=True)A_train = data_train[data_train['礦物類型'] == 1]B_train = data_train[data_train['礦物類型'] == 2]C_train = data_train[data_train['礦物類型'] == 3]D_train = data_train[data_train['礦物類型'] == 4]data_test = pd.concat([x_test, y_test], axis=1)data_test = data_test.reset_index(drop=True)A_test = data_test[data_test['礦物類型'] == 1]B_test = data_test[data_test['礦物類型'] == 2]C_test = data_test[data_test['礦物類型'] == 3]D_test = data_test[data_test['礦物類型'] == 4]A_test=median_method_test(A_train,A_test)B_test = median_method_test(B_train, B_test)C_test = median_method_test(C_train,C_test)D_test = median_method_test(D_train, D_test)data = pd.concat([A_test, B_test, C_test, D_test])return data.drop('礦物類型', axis=1), data['礦物類型']
def median_method_train(data):fill_values = data.median()data = data.fillna(fill_values)return data
def median_method_test(train_data,test_data):fill_values=train_data.median()test_data=test_data.fillna(fill_values)return test_data

方法④:眾數填充處理(測試集用訓練集對應的眾數來填充)

def mode_train_fill(x_train,y_train):   data = pd.concat([x_train, y_train], axis=1)data = data.reset_index(drop=True)A = data[data['礦物類型'] == 1]B = data[data['礦物類型'] == 2]C = data[data['礦物類型'] == 3]D = data[data['礦物類型'] == 4]A = mode_method_train(A)B = mode_method_train(B)C = mode_method_train(C)D = mode_method_train(D)data = pd.concat([A, B, C, D])return data.drop('礦物類型', axis=1), data['礦物類型']
def mode_test_fill(x_train,y_train,x_test,y_test):data_train = pd.concat([x_train, y_train], axis=1)data_train = data_train.reset_index(drop=True)A_train = data_train[data_train['礦物類型'] == 1]B_train = data_train[data_train['礦物類型'] == 2]C_train = data_train[data_train['礦物類型'] == 3]D_train = data_train[data_train['礦物類型'] == 4]data_test = pd.concat([x_test, y_test], axis=1)data_test = data_test.reset_index(drop=True)A_test = data_test[data_test['礦物類型'] == 1]B_test = data_test[data_test['礦物類型'] == 2]C_test = data_test[data_test['礦物類型'] == 3]D_test = data_test[data_test['礦物類型'] == 4]A_test=mode_method_test(A_train,A_test)B_test = mode_method_test(B_train, B_test)C_test = mode_method_test(C_train,C_test)D_test = mode_method_test(D_train, D_test)data = pd.concat([A_test, B_test, C_test, D_test])return data.drop('礦物類型', axis=1), data['礦物類型']
def mode_method_train(data):fill_values = data.apply(lambda x: x.mode().iloc[0] if len(x.mode())>0 else None)data = data.fillna(fill_values)return data
def mode_method_test(train_data,test_data):fill_values=train_data.apply(lambda x: x.mode().iloc[0] if len(x.mode())>0 else None)test_data=test_data.fillna(fill_values)return test_data

7.調用填充方法,生成各自方法填充后的數據,并保存到各自的excel文件中

由于訓練集樣本不平衡,我們采用smote過采樣來平衡數據

import fill_data
#1.刪除空白數據行處理
# x_train_fill,y_train_fill=fill_data.cca_train_fill(x_train,y_train)
# x_test_fill,y_test_fill=fill_data.cca_train_fill(x_test,y_test)
#2.平均值填充處理
# x_train_fill,y_train_fill=fill_data.mean_train_fill(x_train,y_train)
# x_test_fill,y_test_fill=fill_data.mean_test_fill(x_train_fill,y_train_fill,x_test,y_test)
#中位數填充處理
# x_train_fill,y_train_fill=fill_data.median_train_fill(x_train,y_train)
# x_test_fill,y_test_fill=fill_data.median_test_fill(x_train_fill,y_train_fill,x_test,y_test)
# 眾數填充處理
x_train_fill,y_train_fill=fill_data.mode_train_fill(x_train,y_train)
x_test_fill,y_test_fill=fill_data.mode_test_fill(x_train_fill,y_train_fill,x_test,y_test)
#smote擬合數據
from imblearn.over_sampling import SMOTE
oversample=SMOTE(k_neighbors=1,random_state=42)#保證數據擬合效果,隨機種子
x_train_fill,y_train_fill=oversample.fit_resample(x_train_fill,y_train_fill)#數據存入excel
train_data=pd.concat([y_train_fill,x_train_fill],axis=1)
train_data.to_excel('訓練集[眾數填充].xlsx',index=False)
test_data=pd.concat([y_test_fill,x_test_fill],axis=1)

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

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

相關文章

vue:vue3的方法torefs和方法toref

在 Vue 3 的 Composition API 中,toRef 和 toRefs 是兩個用于處理響應式數據的重要工具,它們專門用于從 reactive() 對象中提取屬性并保持響應性。 toRef() 作用:將 reactive 對象的單個屬性轉換為一個 ref 對象,保持與源屬性的響應式連接。 使用場景: 需要單獨提取 rea…

Android 移動端 UI 設計:前端常用設計原則總結

在 Android 移動端開發中,優秀的 UI 設計不僅需要視覺上的美觀,更需要符合用戶習慣、提升操作效率的設計邏輯。前端 UI 設計原則是指導開發者將功能需求轉化為優質用戶體驗的核心準則,這些原則貫穿于布局結構、交互反饋、視覺呈現等各個環節。…

計算機網絡 TCP三次握手、四次揮手超詳細流程【報文交換、狀態變化】

TCP(傳輸控制協議)是互聯網最重要的協議之一,它保證了數據的可靠、有序傳輸。連接建立時的“三次握手”和連接關閉時的“四次揮手”是其核心機制,涉及特定的報文交換和狀態變化。 一、TCP 三次握手(Three-Way Handshak…

使用Applications Manager進行 Apache Solr 監控

Apache Solr 為一些對性能極為敏感的環境提供搜索支持:電子商務、企業應用、內容門戶和內部知識系統。因此,當出現延遲增加或結果不一致的情況時,用戶會立刻察覺。而當這些問題未被發現時,情況會迅速惡化。 Apache Solr 基于 Apa…

Shell腳本-for循環語法結構

一、前言在 Linux Shell 腳本編程中,for 循環 是最常用的控制結構之一,用于重復執行一段命令,特別適用于處理列表、文件、數字序列等場景。本文將詳細介紹 Shell 腳本中 for 循環的各種語法結構,包括:? 經典 for in 結…

記SpringBoot3.x + Thymeleaf 項目實現(MVC架構模式)

目錄 前言 一、創建SpringBoot項目 1. 創建項目 2. 運行項目 二、連接數據庫實現登錄 1. pom.xml文件引入依賴包 2. application.yml文件配置 3. 數據持久層,mybatis操作映射 4. Service接口及實現 5. Controller代碼 6. Thymeleaf頁面登錄 7. 運行項目…

Java 導出word 實現表格內插入圖表(柱狀圖、折線圖、餅狀圖)--可編輯數據

表格內插入圖表導出效果表格內圖表生成流程分析 核心問題與解決方案 問題 Word 圖表作為獨立對象,容易與文本分離位置難以精確控制,編輯時容易偏移缺乏與表格數據的關聯性 解決方案 直接嵌入:將圖表嵌入表格單元格,確保數據關聯精…

北京JAVA基礎面試30天打卡12

1.MySQL中count(*)、count(I)和count(字段名)有什么區別? 1**.COUNT ()**是效率最高的統計方式:COUNT()被優化為常量,直接統計表的所有記錄數,不依賴字段內容,開銷最低。推薦在統計整個表的記錄數時使用。 2.**COUNT(1…

【AI】——結合Ollama、Open WebUI和Docker本地部署可視化AI大語言模型

🎼個人主頁:【Y小夜】 😎作者簡介:一位雙非學校的大三學生,編程愛好者, 專注于基礎和實戰分享,歡迎私信咨詢! 🎆入門專欄:🎇【MySQL&#xff0…

RAG學習(二)

構建索引 一、向量嵌入 向量嵌入(Embedding)是一種將真實世界中復雜、高維的數據對象(如文本、圖像、音頻、視頻等)轉換為數學上易于處理的、低維、稠密的連續數值向量的技術。 想象一下,我們將每一個詞、每一段話、…

亞馬遜店鋪績效巡檢_影刀RPA源碼解讀

一、項目簡介 本項目是一個基于RPA開發的店鋪績效巡店機器人。該機器人能夠自動化地登錄賣家后臺,遍歷多個店鋪和站點,收集并分析各類績效數據,包括政策合規性、客戶服務績效、配送績效等關鍵指標,并將數據整理到Excel報告中&…

跨越南北的養老對話:為培養“銀發中國”人才注入新動能

2025年8月16日,北京養老行業協會常務副會長陳楫寶一行到訪廣州市白云區粵榮職業培訓學校,受到頤年集團副總李娜的熱情接待。此次訪問不僅是京穗兩地養老行業的一次深度交流,更為推動全國智慧養老體系建設、提升養老服務專業化水平注入了新動能…

Spring IOC 學習筆記

1. 概述Spring IOC(Inversion of Control,控制反轉)是一種設計思想,通過依賴注入(Dependency Injection,DI)實現。它的核心思想是將對象的創建和依賴關系的管理交給Spring容器,從而降…

揭開Android Vulkan渲染封印:幀率暴增的底層指令

ps:本文內容較干,建議收藏后反復邊跟進源碼邊思考設計思想。壹渲染管線的基礎架構為什么叫渲染管線?這里是因為整個渲染的過程涉及多道工序,像管道里的流水線一樣,一道一道的處理數據的過程,所以使用渲染管…

HTTP 請求轉發與重定向詳解及其應用(含 Java 示例)

在 Web 開發中,我們經常需要在不同頁面之間跳轉,比如登錄成功后跳到首頁、提交表單后跳到結果頁面。這時,常見的兩種跳轉方式就是 請求轉發(Request Forward) 和 重定向(Redirect)。雖然它們都能…

如何將 MCP Server (FastMCP) 配置為公網訪問(監聽 0.0.0.0)

如何將 MCP Server (FastMCP) 配置為公網訪問(監聽 0.0.0.0)引言常見錯誤嘗試根本原因:從源碼解析正確的解決方案總結引言 在使用 Model Context Protocol(MCP) 框架開發自定義工具服務器時,我們經常使用 …

The Network Link Layer: 無線傳感器中Delay Tolerant Networks – DTNs 延遲容忍網絡

Delay Tolerant Networks – DTNs 延遲容忍網絡架構歸屬Delay Tolerant Networks – DTNs 延遲容忍網絡應用實例例子 1:瑞典北部的薩米人 (Saami reindeer herders)例子 2:太平洋中的動物傳感網絡DTNs路由方式——存儲&轉發DTNs移動模型Random walk …

計算機視覺(opencv)實戰二——圖像邊界擴展cv2.copyMakeBorder()

OpenCV copyMakeBorder() 圖像邊界擴展詳解與實戰在圖像處理和計算機視覺中,有時需要在原始圖像的四周增加邊界(Padding)。這種操作在很多場景中都有應用,比如:卷積神經網絡(CNN)中的圖像預處理…

ansible管理變量和事實

ansible管理變量和事實與實施任務控制 在 Ansible 中,變量和事實(Facts)就像給劇本(Playbook)配備的 “信息工具箱”,讓你的自動化配置管理更靈活、更智能。 變量:提前準備的 “預設信息” 變…

STM32--寄存器與標準庫函數--基本定時器

目錄 前言 基本定時器概念 定時時間 定時器時鐘確定 倍頻鎖相環被正確配置為168MHz 定時器的庫函數操作 代碼 定時器的寄存器操作 代碼 寄存器 后言 前言 使用平臺:STM32F407ZET6 使用數據手冊:STM32F407數據手冊.pdf 使用參考手冊&…