7 数据清洗入门

7 数据清洗入门

数据清洗是机器学习中至关重要的一步,它的目的是提高数据质量,以便为后续的建模打下良好的基础。本节将介绍数据清洗的基本概念、常见问题及处理方法,并结合案例与代码示例进行说明。

什么是数据清洗?

数据清洗是指识别和修正或删除数据集中的错误、无效或不完整的数据。常见的数据清洗任务包括:

  • 处理缺失值
  • 处理重复数据
  • 标准化数据格式
  • 修正错误的数据类型

处理缺失值

缺失值(Missing Values)是数据清洗中的常见问题。我们可以通过以下几种方法处理缺失值:

1. 删除缺失值

如果数据集中的缺失值占比非常小,可以考虑直接删除包含缺失值的行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import pandas as pd

# 创建示例数据
data = {
'A': [1, 2, None, 4],
'B': [None, 1, 2, 3],
}

df = pd.DataFrame(data)
print("原始数据:")
print(df)

# 删除含缺失值的行
df_cleaned = df.dropna()
print("删除缺失值后的数据:")
print(df_cleaned)

2. 填充缺失值

对于较大比例的缺失值,可以考虑用其他数据进行填充,常见的填充方法有:

  • 使用 均值中位数众数 填充。
  • 使用去掉该列缺失的数据的统计量进行填充。
1
2
3
4
# 使用均值填充缺失值
df['A'].fillna(df['A'].mean(), inplace=True)
print("填充缺失值后的数据:")
print(df)

处理重复数据

在数据集中,重复数据可能导致模型训练的不准确。可以使用 pandasdrop_duplicates 方法来去除重复行。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 创建包含重复行的数据
data_with_duplicates = {
'A': [1, 2, 2, 4],
'B': [1, 1, 2, 3],
}

df_dup = pd.DataFrame(data_with_duplicates)
print("包含重复行的原始数据:")
print(df_dup)

# 删除重复行
df_no_duplicates = df_dup.drop_duplicates()
print("去重后的数据:")
print(df_no_duplicates)

标准化数据格式

数据中的格式不统一会影响数据处理和分析的过程。标准化数据格式包括日期格式、字符串大小写等。

日期格式标准化

1
2
3
4
5
6
7
8
9
10
11
# 创建日期格式不一致的数据
date_data = {
'date': ['2021-01-01', '01/02/2021', '2021.03.03']
}

df_dates = pd.DataFrame(date_data)

# 转换为统一的日期格式
df_dates['date'] = pd.to_datetime(df_dates['date'])
print("标准化后的日期格式:")
print(df_dates)

字符串大小写标准化

确保字符串的一致性,例如全部转为小写或大写:

1
2
3
4
5
6
7
8
9
10
11
# 创建字符串大小写不统一的数据
string_data = {
'name': ['Alice', 'bob', 'CHARLIE']
}

df_strings = pd.DataFrame(string_data)

# 转为小写
df_strings['name'] = df_strings['name'].str.lower()
print("标准化后的字符串格式:")
print(df_strings)

修正错误的数据类型

数据中可能会存在错误的数据类型,导致后续处理无法进行。例如,数字被存储为字符串类型。我们可以使用 pandasastype 方法进行转换。

1
2
3
4
5
6
7
8
9
10
11
# 创建数据类型错误的示例数据
mixed_data = {
'value': ['1', '2', 'three', '4.0']
}

df_mixed = pd.DataFrame(mixed_data)

# 尝试将数据转换为浮点型
df_mixed['value'] = pd.to_numeric(df_mixed['value'], errors='coerce')
print("转换后数据类型的结果:")
print(df_mixed)

总结

数据清洗是机器学习过程中不可或缺的一部分,它直接影响到模型的性能和预测结果。通过处理缺失值、去除重复数据、标准化格式以及修正数据类型,我们能够提升数据的质量,使得后续的分析和建模更加高效和准确。希望通过本节的案例和代码示例,能帮助你更好地理解数据清洗的重要性和实际操作。

8 特征选择与提取

8 特征选择与提取

特征选择与提取是机器学习中的重要步骤,它们帮助我们减少模型复杂度、提升运行效率,并改善模型的预测性能。在本节中,我们将探讨这两个概念的区别、常见方法及其应用案例。

特征选择

特征选择是指从原始特征集中挑选出最相关的特征,以提高模型性能和可解释性。常见的特征选择方法包括:

  1. 过滤法(Filter Method)
    通过统计检验对特征进行评估,与目标变量进行关联。例如,卡方检验皮尔逊相关系数等。

    示例:卡方检验

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    import pandas as pd
    from sklearn.datasets import load_iris
    from sklearn.feature_selection import SelectKBest, chi2

    # 加载数据
    iris = load_iris()
    X = iris.data
    y = iris.target

    # 选择前两个最相关的特征
    X_new = SelectKBest(chi2, k=2).fit_transform(X, y)
    print(X_new)
  2. 包裹法(Wrapper Method)
    通过评估不同特征组合在模型上的表现来选择特征。常用的算法有递归特征消除(RFE)。

    示例:递归特征消除

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from sklearn.datasets import load_iris
    from sklearn.feature_selection import RFE
    from sklearn.linear_model import LogisticRegression

    iris = load_iris()
    X = iris.data
    y = iris.target
    model = LogisticRegression()

    # 使用RFE选择三个特征
    rfe = RFE(model, 3)
    fit = rfe.fit(X, y)
    print("选择的特征:", fit.support_)
    print("特征排名:", fit.ranking_)
  3. 嵌入法(Embedded Method)
    特征选择与模型训练同时进行,例如,Lasso回归会通过L1惩罚来选择特征。

    示例:Lasso回归

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    from sklearn.linear_model import Lasso
    import numpy as np

    # 生成一些随机数据
    np.random.seed(0)
    X = np.random.randn(100, 10)
    y = np.random.randn(100)

    # 使用Lasso进行特征选择
    model = Lasso(alpha=0.1)
    model.fit(X, y)

    print("权重系数:", model.coef_)

特征提取

特征提取是从原始数据中生成新的特征。在高维数据或复杂数据中,特征提取尤为重要。常见方法包括:

  1. 主成分分析(PCA)
    PCA 是一种降维技术,通过将特征向量投影到主成分上来提取新特征。

    示例:主成分分析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from sklearn.decomposition import PCA
    from sklearn.datasets import load_iris

    iris = load_iris()
    X = iris.data

    # 应用PCA,将特征减少到2个主成分
    pca = PCA(n_components=2)
    X_reduced = pca.fit_transform(X)
    print(X_reduced)
  2. 线性判别分析(LDA)
    LDA 是一种监督学习的降维技术,旨在最大化类间距离,同时最小化类内距离。

    示例:线性判别分析

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
    from sklearn.datasets import load_iris

    iris = load_iris()
    X = iris.data
    y = iris.target

    lda = LDA(n_components=2)
    X_lda = lda.fit_transform(X, y)
    print(X_lda)
  3. 自动编码器(Autoencoder)
    自动编码器是一种无监督学习的神经网络,可以用于学习数据的低维表示。

    示例:自动编码器

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from keras.layers import Input, Dense
    from keras.models import Model
    import numpy as np

    # 构造简单的自动编码器
    input_layer = Input(shape=(10,))
    encoded = Dense(3, activation='relu')(input_layer)
    decoded = Dense(10, activation='sigmoid')(encoded)

    autoencoder = Model(input_layer, decoded)
    autoencoder.compile(optimizer='adam', loss='binary_crossentropy')

    # 生成一些随机数据
    X = np.random.rand(1000, 10)
    autoencoder.fit(X, X, epochs=50, batch_size=256, shuffle=True)

    encoder = Model(input_layer, encoded)
    X_encoded = encoder.predict(X)
    print(X_encoded)

总结

特征选择与提取是提高机器学习模型性能的关键步骤。我们通过各种技术(如过滤法、包裹法、嵌入法、PCA、LDA、自动编码器等)来优化特征集。选择适当的方法可以有效减少噪音,提高模型的准确性和可解释性。在实施这些技术时,始终需要结合具体的应用背景和数据特征进行选择。

9 数据标准化与归一化

9 数据标准化与归一化

在机器学习中,数据的预处理是至关重要的步骤。数据标准化归一化是两种常用的方法,能够帮助我们提升模型的训练效果和适应能力。接下来,我们将详细介绍这两种方法及其使用场景,结合案例和代码示例加深理解。

数据标准化

概念

标准化是将数据转换为均值为0,标准差为1的分布。通过标准化,数据的各个特征具有相同的尺度,减少不同特征之间的差异。

公式

标准化的公式为:

$$ z = \frac{(x - \mu)}{\sigma} $$

其中:

  • ( z ) 是标准化后的值
  • ( x ) 是原始值
  • ( \mu ) 是样本均值
  • ( \sigma ) 是样本标准差

案例

假设我们有一个小型的用户数据集,其中包含用户的年收入年龄

年收入 年龄
50000 25
60000 30
75000 35
80000 40

我们希望对年收入进行标准化处理。

代码示例

使用Python的scikit-learn库进行标准化处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
from sklearn.preprocessing import StandardScaler

# 原始数据
data = np.array([[50000, 25], [60000, 30], [75000, 35], [80000, 40]])

# 创建标准化器
scaler = StandardScaler()

# 进行标准化
standardized_data = scaler.fit_transform(data)

print("标准化后的数据:")
print(standardized_data)

输出结果会显示年收入和年龄经过标准化后的值,均值接近0,标准差接近1。

数据归一化

概念

归一化是将数据缩放到一个特定的范围,通常是[0, 1]。归一化有助于加快模型的收敛速度,尤其在使用神经网络时。

公式

归一化的公式为:

$$ x’ = \frac{(x - x_{min})}{(x_{max} - x_{min})} $$

其中:

  • ( x’ ) 是归一化后的值
  • ( x ) 是原始值
  • ( x_{min} ) 和 ( x_{max} ) 是特征的最小值和最大值

案例

沿用之前的用户数据集,我们对年收入进行归一化处理。

代码示例

同样使用scikit-learn库进行归一化处理:

1
2
3
4
5
6
7
8
9
10
11
12
13
from sklearn.preprocessing import MinMaxScaler

# 原始数据
data = np.array([[50000, 25], [60000, 30], [75000, 35], [80000, 40]])

# 创建归一化器
min_max_scaler = MinMaxScaler()

# 进行归一化
normalized_data = min_max_scaler.fit_transform(data)

print("归一化后的数据:")
print(normalized_data)

输出结果将显示所有数据缩放到[0, 1]的范围内,适合不同算法的需求。

选择标准化还是归一化

  • 如果数据呈现正态分布,使用标准化可以更好地描述数据的分布特征。
  • 如果数据存在较大的异常值,可能对标准化造成影响,此时可以考虑使用归一化
  • 对于基于梯度的模型(如神经网络),归一化通常更有效;而线性回归和其他一些模型对标准化的效果更好。

小结

数据标准化归一化是在机器学习模型训练前进行预处理的关键步骤。了解不同方法的原理和应用场景,选择合适的预处理方式,可以显著提高模型的性能。通过示例代码,我们可以快速实现这两种处理方式,并为后续的模型构建打下良好的基础。