一、实验手册
(一)实验目的
- 熟悉数据挖掘预处理的各种方法,包括数据清理、集成、变换和归约等。
- 能够识别数据中存在的噪声、缺失值、不一致性等问题,并运用合适的算法和技术进行处理。
- 掌握至少一种编程语言(如Python)及其相关库来实现数据挖掘预处理操作。
- 提高数据质量,为后续的数据挖掘任务奠定良好基础。
(二)实验原理
- 数据清理:通过填充缺失值(如使用均值、中位数、最可能的值等)、平滑噪声数据(如分箱、回归、离群点分析)、识别和删除离群点以及解决数据不一致性来改善数据质量。
- 数据集成:将多个数据源的数据合并成一个一致的数据存储,需处理实体识别、冗余和相关分析、元组重复以及数据值冲突等问题。
- 数据变换:对数据进行平滑、聚集、规范化、离散化等操作,将数据转换为适合挖掘的形式。
- 数据归约:采用维归约(如属性子集选择、主成分分析)、数量归约(如参数模型、非参数模型)和数据压缩等策略,得到数据集的压缩表示,同时保持分析结果的准确性。
(三)实验环境
建议使用Python语言,并安装以下常用库:
pandas
:用于数据的读取、处理和分析。numpy
:提供数值计算功能。scikit-learn
:包含丰富的数据预处理和机器学习工具。
(四)实验步骤
- 数据加载:使用
pandas
库读取数据集,例如读取CSV文件:
import pandas as pd
data = pd.read_csv('your_data.csv')
- 数据探索:
- 查看数据的基本信息,如形状、列名、数据类型等:
print(data.shape)
print(data.columns)
print(data.dtypes)
- 查看数据的前几行和后几行:
print(data.head())
print(data.tail())
- 统计数据的描述性信息:
print(data.describe())
- 数据清理:
- 缺失值处理:
- 查看缺失值的分布情况:
- 缺失值处理:
print(data.isnull().sum())
- 使用均值填充数值型变量的缺失值:
data['numeric_column'] = data['numeric_column'].fillna(data['numeric_column'].mean())
- 使用众数填充分类型变量的缺失值:
data['categorical_column'] = data['categorical_column'].fillna(data['categorical_column'].mode()[0])
- **噪声数据处理**:
- 采用分箱法进行数据平滑,例如等宽分箱:
import numpy as np
data['column_to_smooth'] = pd.cut(data['column_to_smooth'], bins=5)
- 使用`scikit-learn`的`IsolationForest`检测并删除离群点:
from sklearn.ensemble import IsolationForest
clf = IsolationForest(contamination=0.1)
outliers = clf.fit_predict(data[['column_to_check_outliers']])
data = data[outliers == 1]
- 数据集成(假设从多个CSV文件集成数据):
data1 = pd.read_csv('data1.csv')
data2 = pd.read_csv('data2.csv')
combined_data = pd.concat([data1, data2], axis=0) # 按行合并
- 数据变换:
- 规范化:使用
scikit-learn
的MinMaxScaler
将数据缩放到[0, 1]区间:
- 规范化:使用
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data[['column_to_normalize']] = scaler.fit_transform(data[['column_to_normalize']])
- **离散化**:将数值型变量转换为分类型变量,例如根据数值范围进行划分:
data['age_group'] = pd.cut(data['age'], bins=[0, 18, 30, 50, 100], labels=['Child', 'Young Adult', 'Middle - Aged', 'Senior'])
- 数据归约:
- 属性子集选择:选择部分重要的属性:
selected_data = data[['important_column1', 'important_column2']]
- **主成分分析(PCA)降维**:
from sklearn.decomposition import PCA
pca = PCA(n_components=0.95) # 保留95%的方差
reduced_data = pca.fit_transform(data.drop('target_column', axis=1))
(五)实验报告要求
- 实验目的和原理的阐述。
- 详细描述实验步骤,包括使用的方法和代码。
- 展示数据预处理前后的对比结果,如数据的统计信息、缺失值数量变化等。
- 分析预处理过程中遇到的问题及解决方法。
- 总结数据挖掘预处理对后续数据挖掘任务的影响。
二、案例代码(以鸢尾花数据集为例)
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.decomposition import PCA
from sklearn.ensemble import IsolationForest
# 1. 数据加载
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data',
header=None, names=['sepal_length', 'sepal_width', 'petal_length', 'petal_width', 'class'])
# 2. 数据探索
print("数据形状:", data.shape)
print("列名:", data.columns)
print("数据类型:", data.dtypes)
print("前5行数据:\n", data.head())
print("描述性统计信息:\n", data.describe())
# 3. 数据清理
# 3.1 缺失值处理(假设无缺失值,这里仅为示例)
# 如果有缺失值,例如对sepal_length列进行均值填充
imputer = SimpleImputer(strategy='mean')
data['sepal_length'] = imputer.fit_transform(data[['sepal_length']])
# 3.2 噪声数据处理
# 使用IsolationForest检测离群点
clf = IsolationForest(contamination=0.05)
outliers = clf.fit_predict(data[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']])
data = data[outliers == 1]
# 4. 数据变换
# 4.1 规范化
scaler = MinMaxScaler()
data[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']] = scaler.fit_transform(
data[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']])
# 4.2 离散化(这里对petal_length进行离散化示例)
data['petal_length_group'] = pd.cut(data['petal_length'], bins=3, labels=['short','medium', 'long'])
# 5. 数据归约
# 主成分分析降维
pca = PCA(n_components=2)
reduced_features = pca.fit_transform(data[['sepal_length', 'sepal_width', 'petal_length', 'petal_width']])
reduced_data = pd.DataFrame(reduced_features, columns=['PC1', 'PC2'])
reduced_data['class'] = data['class']
print("预处理后的数据:\n", reduced_data.head())
这个案例代码展示了对鸢尾花数据集进行数据挖掘预处理的常见操作,包括数据加载、探索、清理、变换和归约等步骤 。