用Python對機器學習數據進行縮放

許多機器學習算法期望數據被一致地縮放。

在為機器學習擴展數據時,你應該考慮兩種常用的方法。

在這個教程中,您將了解如何為機器學習重新縮放您的數據。閱讀完這個教程后,您將知道:

  • 如何從頭開始對您的數據進行標準化。
  • 如何從頭開始標準化您的數據。
  • 何時歸一化數據而不是標準化數據。

描述

許多機器學習算法期望輸入和輸出數據的規模是相當的。

它可以幫助在加權輸入以進行預測的方法中,例如線性回歸和邏輯回歸。

在結合加權輸入以復雜方式的方法中(如人工神經網絡和深度學習)實際上需要這樣做。

在這個教程中,我們將練習對一個標準的機器學習數據集進行重新縮放,該數據集以CSV格式提供。

具體來說,是皮馬印第安人數據集。它包含768行和9列。文件中的所有值都是數值,特別是浮點數。我們將首先學習如何加載文件,然后稍后學習如何將加載的字符串轉換為數值。

  • 數據集文件.
  • 數據集詳情.

教程

本教程分為3個部分:

  1. 標準化數據。
  2. 標準化數據。
  3. 何時進行歸一化和標準化。

這些步驟將為你處理擴展自己的數據提供必要的基礎。

1. 數據歸一化

正則化可以根據上下文指代不同的技術。

在這里,我們將歸一化定義為將輸入變量重新縮放至0到1的范圍內。

歸一化要求你知道每個屬性的最小值和最大值。

這可以通過訓練數據進行估算,或者如果你對問題領域有深入的了解,可以直接指定。

您可以通過枚舉數據集中的值來輕松估計每個屬性的最小和最大值。

下面的代碼片段定義了dataset_minmax() 函數,該函數計算數據集中每個屬性的最小值和最大值,然后返回這些最小值和最大值的數組。

# Find the min and max values for each column
def dataset_minmax(dataset):minmax = list()for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]value_min = min(col_values)value_max = max(col_values)minmax.append([value_min, value_max])return minmax

我們可以構造一個用于測試的小數據集如下:

x1 x2

50 30

20 90

使用這個人為的數據集,我們可以測試我們的函數,以計算每列的最小值和最大值。

# Find the min and max values for each column
def dataset_minmax(dataset):minmax = list()for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]value_min = min(col_values)value_max = max(col_values)minmax.append([value_min, value_max])return minmax# Contrive small dataset
dataset = [[50, 30], [20, 90]]
print(dataset)
# Calculate min and max for each column
minmax = dataset_minmax(dataset)
print(minmax)

運行示例將產生以下輸出。

首先,數據集以列表的形式打印,然后以格式打印每列的最小值和最大值列1: 最小值,最大值 和 列2: 最小值,最大值

例如:

[[50, 30], [20, 90]]
[[20, 50], [30, 90]]

一旦我們得到了每列允許的最大值和最小值的估計,我們現在就可以將原始數據歸一化到0到1的范圍內。

將單個值歸一化的計算方法是:

scaled_value = (value - min) / (max - min)

下面是一個在名為normalize_dataset()的函數中的實現,該函數對提供的數據集中的每一列進行值的標準化。

# Rescale dataset columns to the range 0-1
def normalize_dataset(dataset, minmax):for row in dataset:for i in range(len(row)):row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])

我們可以將這個函數與dataset_minmax()函數結合,并對人為數據集進行歸一化。

# Find the min and max values for each column
def dataset_minmax(dataset):minmax = list()for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]value_min = min(col_values)value_max = max(col_values)minmax.append([value_min, value_max])return minmax# Rescale dataset columns to the range 0-1
def normalize_dataset(dataset, minmax):for row in dataset:for i in range(len(row)):row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])# Contrive small dataset
dataset = [[50, 30], [20, 90]]
print(dataset)
# Calculate min and max for each column
minmax = dataset_minmax(dataset)
print(minmax)
# Normalize columns
normalize_dataset(dataset, minmax)
print(dataset)

運行此示例將打印以下輸出,包括標準化的數據集。

[[50, 30], [20, 90]]
[[20, 50], [30, 90]]
[[1, 0], [0, 1]]

我們可以將此代碼與加載CSV數據集的代碼結合起來,加載并標準化皮馬印第安人糖尿病數據集。

下載皮馬印第安人數據集,并將其放置在當前目錄中,文件名pima-indians-diabetes.csv

  • 數據集文件.

打開文件并刪除底部的任何空行。

該示例首先加載數據集,并將每列的值從字符串轉換為浮點數。從數據集中估計每列的最小值和最大值,最后對數據集中的值進行歸一化。

from csv import reader# Load a CSV file
def load_csv(filename):file = open(filename, "rb")lines = reader(file)dataset = list(lines)return dataset# Convert string column to float
def str_column_to_float(dataset, column):for row in dataset:row[column] = float(row[column].strip())# Find the min and max values for each column
def dataset_minmax(dataset):minmax = list()for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]value_min = min(col_values)value_max = max(col_values)minmax.append([value_min, value_max])return minmax# Rescale dataset columns to the range 0-1
def normalize_dataset(dataset, minmax):for row in dataset:for i in range(len(row)):row[i] = (row[i] - minmax[i][0]) / (minmax[i][1] - minmax[i][0])# Load pima-indians-diabetes dataset
filename = 'pima-indians-diabetes.csv'
dataset = load_csv(filename)
print('Loaded data file {0} with {1} rows and {2} columns').format(filename, len(dataset), len(dataset[0]))
# convert string columns to float
for i in range(len(dataset[0])):str_column_to_float(dataset, i)
print(dataset[0])
# Calculate min and max for each column
minmax = dataset_minmax(dataset)
# Normalize columns
normalize_dataset(dataset, minmax)
print(dataset[0])

運行示例會生成以下輸出。

從數據集中打印出第一條評論,在標準化之前和之后,顯示了縮放的效果。

Loaded data file pima-indians-diabetes.csv with 768 rows and 9 columns

[6.0, 148.0, 72.0, 35.0, 0.0, 33.6, 0.627, 50.0, 1.0]

[0.35294117647058826, 0.7437185929648241, 0.5901639344262295, 0.35353535353535354, 0.0, 0.5007451564828614, 0.23441502988898377, 0.48333333333333334, 1.0]

2. 標準化數據

標準化是一種重新縮放技術,指的是將數據的分布以0為中心,并將標準差調整到1。

平均值和標準差可以一起用來總結正態分布,也稱為高斯分布或鐘形曲線。

它要求在縮放之前已知每列值的均值和標準差。與上面的歸一化類似,我們可以從訓練數據中估計這些值,或者使用領域知識來指定它們的值。

讓我們從創建函數開始,以從數據集中估計每列的均值和標準差統計數據。

均值描述了一組數字的中間或集中趨勢。列的均值是通過將列的所有值相加并除以總值數量來計算的。

mean = sum(values) / total_values

下面的函數 column_means() 用于計算數據集中每列的平均值。

# calculate column means
def column_means(dataset):means = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]means[i] = sum(col_values) / float(len(dataset))return means

標準差描述了值從平均值的平均偏差。它可以通過將每個值與平均值的差值平方后求和,然后除以值的數量減去1,再開方來計算。

standard deviation = sqrt( (value_i - mean)^2 / (total_values-1))

下面的函數 column_stdevs() 計算數據集中每列的值的標準差,并假定已經計算出均值。

# calculate column standard deviations
def column_stdevs(dataset, means):stdevs = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):variance = [pow(row[i]-means[i], 2) for row in dataset]stdevs[i] = sum(variance)stdevs = [sqrt(x/(float(len(dataset)-1))) for x in stdevs]return stdevs

再次,我們可以構造一個小型數據集來演示從數據集中估計均值和標準差。

x1 x2

50 30

20 90

30 50

使用Excel電子表格,我們可以估算出每列的均值和標準差如下:

x1 x2

mean 33.3 56.6

stdev 15.27 30.55

使用人為構造的數據集,我們可以估計總結統計量。

from math import sqrt# calculate column means
def column_means(dataset):means = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]means[i] = sum(col_values) / float(len(dataset))return means# calculate column standard deviations
def column_stdevs(dataset, means):stdevs = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):variance = [pow(row[i]-means[i], 2) for row in dataset]stdevs[i] = sum(variance)stdevs = [sqrt(x/(float(len(dataset)-1))) for x in stdevs]return stdevs# Standardize dataset
dataset = [[50, 30], [20, 90], [30, 50]]
print(dataset)
# Estimate mean and standard deviation
means = column_means(dataset)
stdevs = column_stdevs(dataset, means)
print(means)
print(stdevs)

執行此示例將產生以下輸出,與電子表格中計算的數字匹配。

[[50, 30], [20, 90], [30, 50]]
[33.333333333333336, 56.666666666666664]
[15.275252316519467, 30.550504633038933]

一旦計算了匯總統計數據,我們就可以輕松地對每列中的值進行標準化。

將給定值標準化的計算方法如下:

standardized_value = (value - mean) / stdev

下面是一個名為standardize_dataset()的函數,實現了這個方程

# standardize dataset
def standardize_dataset(dataset, means, stdevs):for row in dataset:for i in range(len(row)):row[i] = (row[i] - means[i]) / stdevs[i]

將這些函數與用于估計均值和標準差的匯總統計數據結合起來,我們可以對我們的虛構數據集進行標準化。

from math import sqrt# calculate column means
def column_means(dataset):means = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]means[i] = sum(col_values) / float(len(dataset))return means# calculate column standard deviations
def column_stdevs(dataset, means):stdevs = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):variance = [pow(row[i]-means[i], 2) for row in dataset]stdevs[i] = sum(variance)stdevs = [sqrt(x/(float(len(dataset)-1))) for x in stdevs]return stdevs# standardize dataset
def standardize_dataset(dataset, means, stdevs):for row in dataset:for i in range(len(row)):row[i] = (row[i] - means[i]) / stdevs[i]# Standardize dataset
dataset = [[50, 30], [20, 90], [30, 50]]
print(dataset)
# Estimate mean and standard deviation
means = column_means(dataset)
stdevs = column_stdevs(dataset, means)
print(means)
print(stdevs)
# standardize dataset
standardize_dataset(dataset, means, stdevs)
print(dataset)

執行此示例將生成以下輸出,顯示人為數據集的標準化值。

[[50, 30], [20, 90], [30, 50]]
[33.333333333333336, 56.666666666666664]
[15.275252316519467, 30.550504633038933]
[[1.0910894511799618, -0.8728715609439694], [-0.8728715609439697, 1.091089451179962], [-0.21821789023599253, -0.2182178902359923]]

再次強調,我們可以展示機器學習數據集的標準化。

下面的示例展示了如何加載和標準化Pima Indians糖尿病數據集,假設該數據集位于當前工作目錄,如之前的標準化示例所示。

from csv import reader
from math import sqrt# Load a CSV file
def load_csv(filename):file = open(filename, "rb")lines = reader(file)dataset = list(lines)return dataset# Convert string column to float
def str_column_to_float(dataset, column):for row in dataset:row[column] = float(row[column].strip())# calculate column means
def column_means(dataset):means = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):col_values = [row[i] for row in dataset]means[i] = sum(col_values) / float(len(dataset))return means# calculate column standard deviations
def column_stdevs(dataset, means):stdevs = [0 for i in range(len(dataset[0]))]for i in range(len(dataset[0])):variance = [pow(row[i]-means[i], 2) for row in dataset]stdevs[i] = sum(variance)stdevs = [sqrt(x/(float(len(dataset)-1))) for x in stdevs]return stdevs# standardize dataset
def standardize_dataset(dataset, means, stdevs):for row in dataset:for i in range(len(row)):row[i] = (row[i] - means[i]) / stdevs[i]# Load pima-indians-diabetes dataset
filename = 'pima-indians-diabetes.csv'
dataset = load_csv(filename)
print('Loaded data file {0} with {1} rows and {2} columns').format(filename, len(dataset), len(dataset[0]))
# convert string columns to float
for i in range(len(dataset[0])):str_column_to_float(dataset, i)
print(dataset[0])
# Estimate mean and standard deviation
means = column_means(dataset)
stdevs = column_stdevs(dataset, means)
# standardize dataset
standardize_dataset(dataset, means, stdevs)
print(dataset[0])

運行示例會打印數據集的第一行,首先以原始格式加載,然后進行標準化,這樣我們可以進行比較以查看差異。

Loaded data file pima-indians-diabetes.csv with 768 rows and 9 columns
[6.0, 148.0, 72.0, 35.0, 0.0, 33.6, 0.627, 50.0, 1.0]
[0.6395304921176576, 0.8477713205896718, 0.14954329852954296, 0.9066790623472505, -0.692439324724129, 0.2038799072674717, 0.468186870229798, 1.4250667195933604, 1.3650063669598067]

3. 歸一化和標準化的時機

標準化是一種假設您的數據符合正態分布的縮放技術。

如果給定的數據屬性是正常或接近正常,這可能是應該使用的縮放方法。

記錄標準化過程中使用的摘要統計數據是良好的實踐,這樣你可以在將來標準化你可能希望用于模型的數據時應用它們。

歸一化是一種不需要假設任何特定分布的縮放技術。

如果您的數據不是正態分布的,請在應用機器學習算法之前考慮將其標準化。

在歸一化過程中,記錄每個列的最小值和最大值是良好的實踐,以便將來在使用您的模型時,可以對新數據進行歸一化。

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

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

相關文章

Application-properties 配置大全

SpringBoot - application.properties 配置大全 SpringBoot項目最重要也是最核心的配置文件就是application.properties,所有的框架配置都需要在這個配置文件中說明,以下配置不會的可以進行查閱并修改 #SPRING CONFIG(ConfigFileA…

MXFP4量化:如何在80GB GPU上運行1200億參數的GPT-OSS模型

大型語言模型(Large Language Models, LLMs)如GPT-OSS、GPT-4、LLaMA和Mixtral的快速發展顯著提升了人工智能的能力邊界,但同時也帶來了嚴峻的內存資源挑戰。以1200億參數的模型為例,在FP16精度下僅權重存儲就需要約240GB的內存空…

Unity進階--C#補充知識點--【Unity跨平臺的原理】了解.Net

來源于唐老獅的視頻教學,僅作記錄和感悟記錄,方便日后復習或者查找一.什么是.Net.Net是指微軟一整套技術體系的統稱與代號包含的內容有:框架體系:.Net Frameword, .Net Core, Mono開發語言:C#&a…

論文淺嘗 | 提高大型語言模型的數學推理能力的學習定理基本原理(AAAI2025)

筆記整理:蘭雅榕,浙江大學碩士生,研究方向為知識圖譜、大語言模型論文鏈接:https://ojs.aaai.org/index.php/AAAI/article/view/33662發表會議:AAAI 20251. 動機提高開源大型語言模型(LLM)的數學…

母豬姿態轉換行為識別:計算機視覺與行為識別模型調優指南

母豬姿態轉換行為識別:計算機視覺與行為識別模型調優指南 1. 引言 1.1 研究背景與意義 母豬姿態轉換行為識別是智能養殖領域的重要研究方向,通過計算機視覺技術自動識別母豬的站立、躺臥、行走等姿態變化,對于監測母豬健康狀態、評估福利水平…

K8S集群環境搭建(一)

虛擬機鏡像 ubuntu 24 虛擬機網絡 虛擬網絡–配置 nat模式主機ip配置宿主機ip配置 10.0.0.12 master 2c 10.0.0.15 node1 10.0.0.16 node2 10.0.0.17 node3 10.0.0.20 registersudo vi /etc/netplan/00-installer-config.yaml # 替換為實際文件名 sudo netplan applynetwork:v…

css預編譯器實現星空背景圖

打造夢幻星空背景:用CSS預處理器輕松實現動態效果 星空背景能為網頁增添神秘感和視覺吸引力。通過CSS預處理器(如Sass/Less)可以高效實現可定制化的星空效果,避免重復編寫純CSS代碼。以下是 Vue3 組件皮膚具體實現方法和代碼示例。…

焊接機器人保護氣體效率優化

在現代工業制造領域,焊接機器人的應用日益廣泛,而保護氣體在焊接過程中起著至關重要的作用。如何優化保護氣體的效率,成為焊接技術發展的一個關鍵考量因素。WGFACS節氣裝置的出現,為焊接機器人在保護氣體效率優化方面帶來了顯著的…

Portkey-AI gateway 的一次“假壓縮頭”翻車的完整排障記:由 httpx 解壓異常引發的根因分析

筆者最近在本地搭建了Portkey AI Gateway(模型路由網關),然后按照文檔中的方式進行測試。結果發現,網關能夠接收到請求,但是Python測試的程序卻運行報錯。Python代碼報錯信息如下: Traceback (most recent …

什么是Session? PHP編程中Session用法詳解

一、Session的基本概念 Session 是 Web 開發中用于在服務器端存儲用戶臨時數據的一種機制,它允許服務器在不同的 HTTP 請求之間識別和跟蹤特定用戶的狀態,本質上是?服務器為每個用戶開辟的臨時私有存儲空間?。由于 HTTP 協議本身是無狀態的&#xff…

【大模型】AI平臺 joyagent 2.0 的部署與測試

github鏈接:https://github.com/jd-opensource/joyagent-jdgenie 本篇博客記錄下自己在配置joyagent的過程,以【手動初始化環境,啟動服務】為例,后端調用的deepseek-chat大模型。 前言 JoyAgent是由京東云開源的企業級多智能體系統…

計算機視覺(一):nvidia與cuda介紹

背景與意義 計算機視覺 (Computer Vision, CV) 需要對圖像和視頻進行處理、特征提取和模型訓練,計算量巨大。GPU (圖形處理單元) 擅長并行計算,非常適合深度學習、卷積操作、矩陣乘法等場景。NVIDIA 作為 GPU 領域的領導者,推出了 CUDA (Comp…

阿里云杭州 AI 產品法務崗位信息分享(2025 年 8 月)

(注:本崗位信息已獲jobleap.cn授權,可在 CSDN 平臺發布) 一、基本信息 招聘方:阿里云工作地點:杭州信息收錄時間:2025 年 08 月 14 日 二、職位主要職責 為 AI 相關產品全流程提供法務支持&…

醫療智慧大屏系統 - Flask + Vue實現

下面我將實現一個完整的醫療智慧大屏系統,使用Flask作為后端框架,前端使用Vue.js結合ECharts進行醫療數據的可視化展示,文章末尾提交源碼下載。 系統設計思路 前端部分: 使用Vue.js構建響應式界面 使用ECharts實現各類醫療數據可…

庫制作與原理(下)

庫制作與原理 (下) 1. 目標文件 編譯和鏈接這兩個步驟,在 Windows 下被我們的 IDE 封裝的很完美,我們一般都是一鍵構建非常方便,但一旦遇到錯誤的時候呢,尤其是鏈接相關的錯誤,很多人就束手無策了。在 Linux 下&#x…

STL 容器

STL是C的核心組成部分,其主要包括了容器、迭代器、算法三大組件。 其中容器負責存儲數據,迭代器是容器和算法的橋梁,負責對容器中的元素進行操作。本文重點介紹容器部分內容。 STL主要容器 STL容器根據特性進行分類,可以分為序列式…

微信小程序 拖拽簽章

微信小程序 拖拽簽章 效果 主要實現的功能點 文件按比例加載圖片(寬高設定拖拽范圍) 彈層展示印章模板 模板拖拽到文件圖片上 實時獲取拽拽位置 難點 彈層中的元素如何拖拽到文件圖片上 實現歷程 版本1.0 以前我們拖拽一個圖層到另一個圖層上,pc端使用的是mousedown mou…

人工智能加速計算套件

按照甲方要求的技術指標的人工智能加速計算套件1套。每套包含以下內容: 1、顯卡 不低于6542Y;容量不低于 48GB GDDR6顯存;CUDA核心不低于14080 個 ;第四代Tensor Core不低于440 個;單精度性能不低于69.3 TFLOPS&#x…

端到端測試:復雜系統的終極體檢術

當你的應用像多米諾骨牌一樣牽一發而動全身,如何確保用戶一路暢通無阻?一、為什么我們需要端到端測試? 想象一下:你精心開發的電商應用,用戶登錄順利,商品瀏覽流暢,卻在最后支付時卡殼——原因是…

Perf使用詳解

Perf 工具深度解析 Perf(Performance Counters for Linux)是 Linux 系統的性能分析工具,基于內核的 perf_event 子系統,通過硬件性能計數器(PMC)、軟件事件和跟蹤點(tracepoints)實現…