自己复习用,内容大融合,还在编写中...
数据整理和预处理是数据分析和机器学习项目中一个至关重要的步骤。这一过程涉及到从原始数据中清洗、筛选和转换数据,以便于进行进一步的分析或建模。以下是一些常见的数据整理和预处理步骤:
-
数据清洗:
- 移除重复或无关的记录。
- 处理缺失值,可以通过删除含有缺失值的记录、填充缺失值或使用插值方法来处理。
- 识别和修正错误的数据点或异常值。
-
数据转换:
- 标准化和归一化数据,以便于不同量级的特征可以被平等地考虑。
- 进行数据编码,如将类别数据转换为数值数据,常见的方法包括独热编码(One-Hot Encoding)或标签编码(Label Encoding)。
- 特征工程,包括创建新的特征或修改现有特征,以增强模型的预测能力。
-
数据分割:
- 将数据集分割成训练集、验证集和测试集,以便于在不同的数据子集上训练和评估模型的性能。
-
数据探索:
- 进行探索性数据分析(EDA),通过统计摘要、可视化等方法,理解数据的分布、趋势和关系。
-
特征选择:
- 选择对预测目标最有用的特征,以减少模型的复杂性和过拟合的风险。这可以通过各种统计测试、模型基础的特征重要性评估等方法来实现。
-
处理不平衡数据:
- 在分类问题中,如果某些类别的样本数量远多于其他类别,可能需要进行重采样技术,如过采样少数类别或欠采样多数类别,以避免模型偏向于预测多数类别。
目录
数据清洗
在Python中进行数据清洗通常涉及多个步骤,包括处理缺失值、异常值、重复数据等。Pandas是Python中最流行的数据处理库之一,提供了丰富的数据结构和功能,非常适合进行数据清洗。以下是一些基本的数据清洗操作,使用Pandas来实现。
1. 处理缺失值
缺失值处理是数据清洗中的一项基本任务。常见的处理方法包括删除含有缺失值的行或列,或者填充缺失值。
import pandas as pd
import numpy as np
# 示例DataFrame
df = pd.DataFrame({
'A': [1, 2, np.hi, 4],
'B': [5, np.hi, np.hi, 8],
'C': [10, 20, 30, 40]
})
# 删除含有缺失值的行
df_dropna = df.dropna()
# 填充缺失值,例如使用列的平均值
df_fillna = df.fillna(df.mean())
2. 修正或删除异常值
识别异常值
1.统计方法
- Z-分数: 使用Z-分数(或标准分数)识别异常值是一种基于统计学的方法,它考虑了数据的均值和标准差。Z-分数表示一个数据点与数据集均值的差异,用标准差的数量表示。数据点的Z-分数越高,说明这个数据点与均值的差异越大。在实践中,通常认为Z-分数的绝对值大于2或3(根据具体情况而定)的数据点可能是异常值。
以下示例展示了如何使用Python的SciPy库计算Z-分数,并使用Pandas识别和过滤异常值。
import pandas as pd
from scipy import stats
# 创建示例数据
data = {'column_name': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 100]}
df = pd.DataFrame(data)
# 计算Z-分数
df['Z_score'] = stats.zscore(df['column_name'])
# 过滤异常值,这里以Z-分数的绝对值大于3为标准
outliers = df[(df['Z_score'].abs() > 3)]
non_outliers = df[(df['Z_score'].abs() <= 3)]
print("异常值:\n", outliers)
print("\n非异常值:\n", non_outliers)
在这个例子中,stats.zscore()
函数计算了column_name
列的Z-分数。然后,基于Z-分数的绝对值大于3的规则,数据被分类为异常值或非异常值。
注意事项
- Z-分数方法假设数据大致符合正态分布。如果数据分布显著偏离正态分布,这种方法可能不太适用。
- Z-分数的阈值(常用的是2或3)可以根据数据的具体情况进行调整。阈值越低,识别为异常的数据点越多。
- 和处理IQR识别的异常值一样,识别出的异常值应该仔细检查,以确定它们是否真的是错误或者只是自然波动的结果。在某些情况下,异常值可能代表了重要的信息。
- IQR(四分位距): IQR(Interquartile Range,四分位距)是统计学中用于衡量数据变异性和识别异常值的一种方法。它是上四分位数(Q3)与下四分位数(Q1)之间的差值,反映了数据集中间50%数据的分布范围。计算IQR可以帮助确定数据的离散度和异常值的存在。通常,低于Q1 - 1.5 x IQR或高于Q3+1.5 x IQR的数据点被视为异常值。
计算步骤:
- 排序:将数据从小到大排序。
- 计算Q1和Q3:
- Q1(第一四分位数):是将数据分成四等份后,位于第一等份的最后一个数值,表示了所有数据中有25%的数据小于或等于这个值。
- Q3(第三四分位数):同理,表示了所有数据中有75%的数据小于或等于这个值。
- 计算IQR:IQR=Q3-Q1
在Python中,可以使用Pandas或NumPy库来方便地计算IQR。以下是一个使用Pandas的例子:
假设你有一个DataFrame df
,其中包含你想要检查异常值的列 column_name
。
import pandas as pd
# 创建示例数据
data = {'column_name': [1, 2, 3, 4, 5, 6, 100, 7, 8, 9, 10]}
df = pd.DataFrame(data)
# 计算Q1和Q3
Q1 = df['column_name'].quantile(0.25)
Q3 = df['column_name'].quantile(0.75)
# 计算IQR
IQR = Q3 - Q1
# 定义异常值的范围
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 识别异常值
outliers = df[(df['column_name'] < lower_bound) | (df['column_name'] > upper_bound)]
non_outliers = df[(df['column_name'] >= lower_bound) & (df['column_name'] <= upper_bound)]
print("异常值:\n", outliers)
print("\n非异常值:\n", non_outliers)
在这个例子中,quantile(0.25)
和quantile(0.75)
分别用于计算第一四分位数(Q1)和第三四分位数(Q3),然后根据这些值计算IQR。接着,根据IQR定义异常值的界限:低于Q1 - 1.5 * IQR
或高于Q3 + 1.5 * IQR
的值被视为异常值。最后,使用这些界限过滤DataFrame以识别异常值和非异常值。
注意事项
- 这种方法假设数据大致是对称分布的,如果数据严重偏斜,可能需要其他方法来更准确地识别异常值。
- IQR方法适用于连续数据。对于分类数据,异常值的识别可能需要不同的方法。
- 异常值不一定总是错误或不希望的数据点,有时候它们可能表示重要的、值得进一步研究的现象。因此,确定数据点是否真的是异常值,并决定如何处理它们之前,需要仔细考虑上下文。
2.可视化方法
箱形图(Boxplot): 利用IQR规则,箱形图直观地显示异常值。
箱形图(Boxplot)是一种标准的图表表示形式,用于显示数据的分布情况,包括中位数、四分位数以及异常值。它是通过数据的四分位数(Q1, Q3)和中位数(Q2)来构建的,同时利用这些四分位数计算IQR(四分位距)