「日拱一码」020 机器学习——数据处理

目录

数据清洗

缺失值处理

删除缺失值:

填充缺失值:

重复值处理

检测重复值

处理重复值

异常值处理

Z-score方法

IQR方法(四分位距)

数据一致性检查

数据转换

规范化(归一化)

Min-Max归一化

MaxAbsScaler

标准化

离散化

等宽离散化

等频离散化


数据清洗

数据清洗是数据处理的第一步,目的是去除噪声数据、处理缺失值和异常值,使数据更加干净、可用

缺失值处理

删除缺失值:

如果数据集中缺失值较少,可以直接删除包含缺失值的行或列

python 复制代码
## 数据清洗
# 缺失值处理
# 删除缺失值
import pandas as pd

# 创建一个包含缺失值的DataFrame
data = {'A': [1, 2, None, 4], 'B': [5, None, 7, 8]}
df = pd.DataFrame(data)

# 删除包含缺失值的行
df_dropped = df.dropna(axis=0)
print("删除缺失值后的数据:")
print(df_dropped)
#      A    B
# 0  1.0  5.0
# 3  4.0  8.0
填充缺失值:

如果删除缺失值会导致数据量损失过多,可以选择填充缺失值。常见的填充方法包括使用均值、中位数、众数或前向/后向填充

python 复制代码
# 填充缺失值
# 使用均值填充缺失值
df_mean = df.fillna(df.mean())
print("使用均值填充后的数据:")
print(df_mean)
#           A         B
# 0  1.000000  5.000000
# 1  2.000000  6.666667
# 2  2.333333  7.000000
# 3  4.000000  8.000000

df_mode = df.fillna(df.mode())
print("使用众数填充后的数据:")
print(df_mode)
#      A    B
# 0  1.0  5.0
# 1  2.0  7.0
# 2  4.0  7.0
# 3  4.0  8.0

# 使用前向填充
df_ffilled = df.fillna(method='ffill')
print("使用前向填充后的数据:")
print(df_ffilled)
#      A    B
# 0  1.0  5.0
# 1  2.0  5.0
# 2  2.0  7.0
# 3  4.0  8.0

重复值处理

在数据处理中,重复值可能会对模型训练和分析结果产生误导性的影响,因此需要进行检测和处理

检测重复值

在处理重复值之前,首先需要检测数据中是否存在重复的行或列

python 复制代码
# 重复值处理
# 检测重复值
import pandas as pd

# 创建一个包含重复行的 DataFrame
data = {'A': [1, 2, 3, 2, 1], 'B': [4, 5, 6, 5, 4]}
df = pd.DataFrame(data)

# 检测重复行
duplicates = df.duplicated()
print("重复行:")
print(duplicates)
# 0    False
# 1    False
# 2    False
# 3     True
# 4     True
# dtype: bool

# 显示重复的行
print("重复的行数据:")
print(df[duplicates])
#    A  B
# 3  2  5
# 4  1  4

# 检测重复列
duplicates_columns = df.T.duplicated()
print("重复列:")
print(duplicates_columns)
# A    False
# B    False
# dtype: bool

# 显示重复的列
print("重复的列数据:")
print(df.loc[:, duplicates_columns])
# Empty DataFrame
# Columns: []
# Index: [0, 1, 2, 3, 4]
处理重复值

处理重复值的方法通常包括删除重复值或保留一条重复记录

python 复制代码
# 处理重复值
# 删除重复行
df_cleaned = df.drop_duplicates()
print("删除重复行后的数据:")
print(df_cleaned)
#    A  B
# 0  1  4
# 1  2  5
# 2  3  6

# 删除重复列
df_cleaned_columns = df.loc[:, ~duplicates_columns]
print("删除重复列后的数据:")
print(df_cleaned_columns)
#    A  B
# 0  1  4
# 1  2  5
# 2  3  6
# 3  2  5
# 4  1  4

# 保留第一条重复记录
df_keep_first = df.drop_duplicates(keep='first')
print("保留第一条重复记录后的数据:")
print(df_keep_first)
#    A  B
# 0  1  4
# 1  2  5
# 2  3  6

# 保留最后一条重复记录
df_keep_last = df.drop_duplicates(keep='last')
print("保留最后一条重复记录后的数据:")
print(df_keep_last)
#    A  B
# 2  3  6
# 3  2  5
# 4  1  4

异常值处理

异常值是指数据中明显偏离正常范围的值,需要进行检测和处理

Z-score方法

通过标准化方法检测异常值

python 复制代码
# 异常值处理
# Z-score
from scipy import stats
import numpy as np

data = [1, 2, 3, 4, 100]
z_scores = stats.zscore(data)
print("Z-scores:", z_scores)
# [-0.53828462 -0.51265202 -0.48701942 -0.46138681  1.99934286]

# 检测异常值(Z-score大于1或小于-1)
threshold = 1
outliers = np.where(np.abs(z_scores) > threshold)
print("异常值索引:", outliers)
# (array([4], dtype=int64),)
IQR方法(四分位距)

通过四分位数检测异常值

python 复制代码
# IQR方法(四分位距)
Q1 = np.percentile(data, 25)
Q3 = np.percentile(data, 75)
IQR = Q3 - Q1

lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

print("下界:", lower_bound) # -1.0
print("上界:", upper_bound) # 7.0

outliers = [x for x in data if x < lower_bound or x > upper_bound]
print("异常值:", outliers) # [100]

数据一致性检查

确保数据在逻辑上是合理的,例如日期格式、数值范围等

python 复制代码
# 数据一致性检查
# 检查日期格式
import pandas as pd

data = {'date': ['2025-01-01', '2025-02-30', '2025-03-15']}
df = pd.DataFrame(data)

# 尝试将日期列转换为日期格式,错误的日期会报错
df['date'] = pd.to_datetime(df['date'], errors='coerce')
print("转换后的数据:")
print(df)
#         date
# 0 2025-01-01
# 1        NaT
# 2 2025-03-15

数据转换

数据转换是将数据转换为适合模型处理的格式,常见的方法包括规范化、标准化、离散化等

规范化(归一化)

将数据缩放到指定范围,如0, 1或-1, 1

Min-Max归一化

将数据缩放到0, 1区间

python 复制代码
## 数据转换
# 规范化(归一化)
# Min-Max归一化
from sklearn.preprocessing import MinMaxScaler

data = [[1], [2], [3], [4]]
scaler = MinMaxScaler()
normalized_data = scaler.fit_transform(data)
print("归一化后的数据:")
print(normalized_data)
# [[0.        ]
#  [0.33333333]
#  [0.66666667]
#  [1.        ]]
MaxAbsScaler

将数据缩放到-1, 1区间

python 复制代码
# MaxAbsScaler
from sklearn.preprocessing import MaxAbsScaler

scaler = MaxAbsScaler()
normalized_data = scaler.fit_transform(data)
print("MaxAbsScaler归一化后的数据:")
print(normalized_data)
# [[0.25]
#  [0.5 ]
#  [0.75]
#  [1.  ]]

标准化

将数据转换为均值为0、标准差为1的分布

python 复制代码
# 标准化
from sklearn.preprocessing import StandardScaler

data = [[1], [2], [3], [4]]
scaler = StandardScaler()
standardized_data = scaler.fit_transform(data)
print("标准化后的数据:")
print(standardized_data)
# [[-1.34164079]
#  [-0.4472136 ]
#  [ 0.4472136 ]
#  [ 1.34164079]]

离散化

将连续数据划分为离散区间

等宽离散化

将数据划分为等宽的区间

python 复制代码
# 离散化
# 等宽离散化
import pandas as pd

data = {'score': [85, 90, 78, 92, 88, 76, 95, 89, 77, 82]}
df = pd.DataFrame(data)
df['score_discret'] = pd.cut(df['score'], bins=3, labels=False)
print("等宽离散化后的数据:")
print(df)
#    score  score_discret
# 0     85              1
# 1     90              2
# 2     78              0
# 3     92              2
# 4     88              1
# 5     76              0
# 6     95              2
# 7     89              2
# 8     77              0
# 9     82              0
等频离散化

将数据划分为等数量的区间

python 复制代码
# 等频离散化
df['score_discret'] = pd.qcut(df['score'], q=3, labels=False)
print("等频离散化后的数据:")
print(df)
#    score  score_discret
# 0     85              1
# 1     90              2
# 2     78              0
# 3     92              2
# 4     88              1
# 5     76              0
# 6     95              2
# 7     89              1
# 8     77              0
# 9     82              0
相关推荐
檐下翻书1731 天前
算法透明度审核:AI 决策的 “黑箱” 如何被打开?
人工智能
undsky_1 天前
【RuoYi-SpringBoot3-Pro】:接入 AI 对话能力
人工智能·spring boot·后端·ai·ruoyi
网易伏羲1 天前
网易伏羲受邀出席2025具身智能人形机器人年度盛会,并荣获“偃师·场景应用灵智奖
人工智能·群体智能·具身智能·游戏ai·网易伏羲·网易灵动·网易有灵智能体
搬砖者(视觉算法工程师)1 天前
什么是无监督学习?理解人工智能中无监督学习的机制、各类算法的类型与应用
人工智能
西格电力科技1 天前
面向工业用户的绿电直连架构适配技术:高可靠与高弹性的双重设计
大数据·服务器·人工智能·架构·能源
小裴(碎碎念版)1 天前
文件读写常用操作
开发语言·爬虫·python
TextIn智能文档云平台1 天前
图片转文字后怎么输入大模型处理
前端·人工智能·python
Hy行者勇哥1 天前
从零搭建小智 AI 音箱 MCP 开发环境:自定义智能家居控制技能实战指南
人工智能·嵌入式硬件·硬件工程·智能家居
leaf_leaves_leaf1 天前
强化学习奖励曲线
人工智能
数据的世界011 天前
重构智慧书-第18条:实力与实干
人工智能