我们首先从UCI机器学习库加载著名的鸢尾花数据集:
data = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data', header=None)
data.columns = ['花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度', '类别']
数据集包含150个样本,每个样本有4个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)和1个类别标签(3种鸢尾花)。
我们对数值型特征进行基本统计:
for col in data.columns:
if is_numeric_dtype(data[col]):
print('%s:' % (col))
print('\t 平均值 = %.2f' % data[col].mean())
print('\t 标准差 = %.2f' % data[col].std())
print('\t 最小值 = %.2f' % data[col].min())
print('\t 最大值 = %.2f' % data[col].max())
data['花萼长度'].hist(bins=8)
plt.title('花萼长度分布直方图')
numeric_data.boxplot()
plt.title('鸢尾花数据箱线图')
fig, axes = plt.subplots(3, 2, figsize=(12, 12))
# 绘制所有两两特征的散点图
parallel_coordinates(data_zh, '类别')
plt.title('鸢尾花数据平行坐标图')
data = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/breast-cancer-wisconsin/breast-cancer-wisconsin.data', header=None)
data.columns = ['Sample code', 'Clump Thickness', 'Uniformity of Cell Size', 'Uniformity of Cell Shape',
'Marginal Adhesion', 'Single Epithelial Cell Size', 'Bare Nuclei', 'Bland Chromatin',
'Normal Nucleoli', 'Mitoses','Class']
data = data.replace('?',np.NaN)
print('Number of missing values:')
for col in data.columns:
print('\t%s: %d' % (col,data[col].isna().sum()))
data2 = data2.fillna(pd.to_numeric(data2, errors='coerce').median())
Z = (data2-data2.mean())/data2.std()
Z2 = Z.loc[((Z > -3).sum(axis=1)==9) & ((Z <= 3).sum(axis=1)==9),:]
dups = data.duplicated()
data2 = data.drop_duplicates()
sample = data.sample(n=3) # 简单随机采样
sample = data.sample(frac=0.01, random_state=1) # 按比例采样
sample = data.sample(frac=0.01, replace=True, random_state=1) # 有放回采样
bins = pd.cut(data['Clump Thickness'],4) # 等宽分箱
bins = pd.qcut(data['Clump Thickness'],4) # 等频分箱
我们尝试对食物图片进行PCA降维:
numComponents = 2
pca = PCA(n_components=numComponents)
pca.fit(imgData)
projected = pca.transform(imgData)
通过散点图可视化降维结果,可以看到不同类别食物在PCA空间中的分布。
在数据科学和机器学习的世界中,数据预处理和可视化是构建有效模型的基础步骤。本文将通过实例,深入探讨数据预处理的关键技术和强大的可视化方法,帮助您更好地理解和处理数据。
在真实数据集中,缺失值是一个常见问题。以乳腺癌威斯康星数据集为例,我们可以看到"Bare Nuclei"属性中存在缺失值(用问号表示)。
处理缺失值的常见方法:
# 将'?'替换为NaN
data = data.replace('?', np.NaN)
# 使用中位数替换缺失值
data['Bare Nuclei'] = data['Bare Nuclei'].fillna(pd.to_numeric(data['Bare Nuclei'], errors='coerce').median())
# 或者丢弃缺失值记录
data_no_na = data.dropna()
# 使用Z分数识别异常值
Z = (data_numeric - data_numeric.mean()) / data_numeric.std()
# 移除Z分数绝对值大于3的异常值
data_clean = Z.loc[((Z > -3).sum(axis=1) == 9) & ((Z <= 3).sum(axis=1) == 9), :]
异常值会显著影响统计分析和模型性能。使用箱线图和Z分数是检测异常值的有效方法。
数据集中的重复记录会导致模型过拟合特定实例,影响泛化能力
# 检测重复行
dups = data.duplicated()
print('重复行数 = %d' % (dups.sum()))
# 移除重复行
data_unique = data.drop_duplicates()
数据聚合可以减少数据波动,提供更清晰的趋势视图。以底特律降水量数据为例,我们可以从每日数据聚合到月度或年度视图。
# 按月聚合
monthly = daily.groupby(pd.Grouper(freq='M')).sum()
# 按年聚合
annual = daily.groupby(pd.Grouper(freq='Y')).sum()
每个级别的聚合都显示不同波动程度的趋势,年度数据的方差显著小于每日数据。
在处理大型数据集时,采样可以减少计算负担:
# 不放回采样
sample = data.sample(frac=0.01, random_state=1)
# 放回采样
sample = data.sample(frac=0.01, replace=True, random_state=1)
将连续属性转换为离散值有助于减少过拟合并提高模型解释性:
# 等宽离散化
bins = pd.cut(data['Clump Thickness'], 4)
# 等频离散化
bins = pd.qcut(data['Clump Thickness'], 4)
PCA是降低数据维度的强大工具,特别适用于高维数据如图像:
numComponents = 2
pca = PCA(n_components=numComponents)
pca.fit(imgData)
projected = pca.transform(imgData)
通过降维,我们可以在低维空间中识别不同类别的项目,如食物图像分类中的汉堡、饮料、意大利面和鸡肉。
在探索鸢尾花数据集时,我们使用了多种可视化技术:
直方图和箱线图展示单个属性的分布:
# 直方图
data['花萼长度'].hist(bins=8)
# 箱线图
numeric_data.boxplot()
散点图和平行坐标图帮助理解属性间的关系:
·
# 不同类别的散点图
for cls in data['类别'].unique():
subset = data[data['类别'] == cls]
plt.scatter(subset[data.columns[i]], subset[data.columns[j]], label=cls)
# 平行坐标图
parallel_coordinates(data_zh, '类别')
这些可视化方法揭示了鸢尾花品种间的差异和属性间的相关性。例如,花瓣长度和宽度在区分品种上比花萼尺寸更有效。
通过底特律机场的降水数据(DTW_prec.csv),我们可以观察不同时间尺度的气候模式:
鸢尾花数据集分析显示:
数据预处理和可视化是数据科学工作流中不可或缺的环节。通过适当的预处理技术,我们可以处理现实数据中的各种问题;通过有效的可视化方法,我们能更深入地理解数据结构和模式。这些基础技能不仅对数据分析至关重要,也是构建可靠机器学习模型的前提条件。
本文通过两个经典数据集展示了数据分析的全流程:
这些技术是数据科学项目的基础,掌握它们将帮助你更好地理解和处理各种数据集。