如何使用Python加载并探索Wine数据集

5 次阅读

Wine数据集是机器学习入门阶段非常经典的数据集之一,适合用于分类、数据分析、特征探索以及可视化练习。Python生态中可以直接通过scikit-learn加载Wine数据集,不需要额外下载文件,因此非常适合快速搭建实验环境。

一、Wine数据集是什么

Wine数据集通常指scikit-learn内置的葡萄酒分类数据集,来源于UCI Machine Learning Repository。数据集中包含178条样本,每条样本有13个数值特征,并对应3种不同的葡萄酒类别。

13个特征主要描述葡萄酒的化学性质,例如:

  • Alcohol:酒精含量

  • Malic acid:苹果酸

  • Ash:灰分

  • Alcalinity of ash:灰分碱度

  • Magnesium:镁含量

  • Total phenols:总酚

  • Flavanoids:黄酮类物质

  • Nonflavanoid phenols:非黄酮类酚

  • Proanthocyanins:原花青素

  • Color intensity:颜色强度

  • Hue:色调

  • OD280/OD315 of diluted wines:稀释葡萄酒的OD280/OD315

  • Proline:脯氨酸

由于这些特征全部是数值型数据,因此非常适合用于Pandas数据分析、Matplotlib可视化以及scikit-learn机器学习模型训练。

二、安装Python机器学习环境

如果还没有安装scikit-learn,可以通过pip安装:

Bash
pip install scikit-learn pandas matplotlib seaborn

其中:

  • scikit-learn用于加载数据集以及后续机器学习建模;

  • pandas用于数据整理和统计分析;

  • matplotlib用于绘制图表;

  • seaborn可以进一步美化数据可视化效果。

安装完成后,可以测试scikit-learn是否能够正常导入:

Python
运行
import sklearn

print(sklearn.__version__)

如果能够正常输出版本号,就说明环境基本配置完成。

三、使用Python加载Wine数据集

scikit-learn提供了load_wine()函数,可以直接读取Wine数据集。

Python
运行
from sklearn.datasets import load_wine

wine = load_wine()

print(wine)

通常不建议直接打印整个对象,因为输出内容比较多。实际分析时,可以分别查看数据、标签和特征名称。

Python
运行
print(wine.data)
print(wine.target)
print(wine.feature_names)

其中,wine.data保存特征数据,wine.target保存分类标签,而wine.feature_names保存13个特征名称。

还可以查看数据集中的类别名称:

Python
运行
print(wine.target_names)

输出通常为:

['class_0' 'class_1' 'class_2']

四、查看Wine数据集的基本信息

加载数据之后,第一步通常是确认数据规模。

Python
运行
print("特征数据形状:", wine.data.shape)
print("标签数据形状:", wine.target.shape)

Wine数据集的特征矩阵形状为:

(178, 13)

这意味着共有178条样本,每条样本包含13个特征。

标签数组的形状为:

(178,)

也就是说,每条样本都有一个对应的类别标签。

如果想进一步查看数据类型,可以执行:

Python
运行
print(type(wine.data))
print(type(wine.target))

默认情况下,wine.data和wine.target都是NumPy数组。

五、将Wine数据集转换为Pandas DataFrame

NumPy数组适合进行数值计算,但进行数据探索时,Pandas DataFrame通常更加方便。

可以按照下面的方法转换:

Python
运行
import pandas as pd
from sklearn.datasets import load_wine

wine = load_wine()

df = pd.DataFrame(
    wine.data,
    columns=wine.feature_names
)

df["target"] = wine.target

print(df.head())

这样就得到了一个结构化的数据表。

查看前5条记录:

Python
运行
print(df.head())

查看后5条记录:

Python
运行
print(df.tail())

如果希望随机查看部分数据,可以使用:

Python
运行
print(df.sample(5))

相比固定查看前几条数据,随机抽样有助于快速了解数据在不同位置上的表现。

六、查看数据集结构

Pandas的info()方法可以快速了解DataFrame结构。

Python
运行
df.info()

通过这个方法可以看到:

  • 总行数;

  • 每一列的名称;

  • 每列的数据类型;

  • 非空数据数量;

  • 内存占用情况。

Wine数据集的13个特征都是数值类型,因此后续进行统计分析和机器学习处理时比较方便。

还可以查看数据维度:

Python
运行
print(df.shape)

查看列名:

Python
运行
print(df.columns)

如果只想查看特征名称,可以使用:

Python
运行
print(wine.feature_names)

七、检查Wine数据集是否存在缺失值

数据清洗是探索数据的重要步骤。虽然scikit-learn提供的Wine数据集本身通常不包含缺失值,但实际项目中仍然建议主动检查。

Python
运行
print(df.isnull().sum())

如果每一列结果都是:

0

说明对应列没有缺失值。

也可以直接判断整个数据集中是否存在缺失值:

Python
运行
print(df.isnull().values.any())

返回:

False

表示没有发现缺失值。

需要注意的是,不能因为某个内置数据集没有缺失值,就省略真实项目中的缺失数据检查。实际业务数据往往需要进行缺失值填充、删除或者其他处理。

八、统计Wine数据集的基本特征

Pandas的describe()方法可以快速生成描述性统计信息。

Python
运行
print(df.describe())

结果通常会包含:

  • count:样本数量

  • mean:平均值

  • std:标准差

  • min:最小值

  • 25%:第一四分位数

  • 50%:中位数

  • 75%:第三四分位数

  • max:最大值

例如查看Alcohol特征:

Python
运行
print(df["alcohol"].describe())

还可以单独计算平均值:

Python
运行
print(df["alcohol"].mean())

计算中位数:

Python
运行
print(df["alcohol"].median())

计算标准差:

Python
运行
print(df["alcohol"].std())

这些统计指标能够帮助我们初步判断数据的分布范围以及离散程度。

九、探索Wine数据集中的类别分布

Wine数据集属于分类数据,因此标签分布是值得重点关注的内容。

可以使用Pandas统计不同类别的样本数量:

Python
运行
print(df["target"].value_counts())

也可以直接查看NumPy数组中的类别数量:

Python
运行
import numpy as np

unique, counts = np.unique(wine.target, return_counts=True)

for label, count in zip(unique, counts):
    print(label, count)

进一步绘制类别分布图:

Python
运行
import matplotlib.pyplot as plt

df["target"].value_counts().sort_index().plot(
    kind="bar"
)

plt.xlabel("Wine Class")
plt.ylabel("Count")
plt.title("Wine Dataset Class Distribution")
plt.show()

通过柱状图,可以直观判断不同葡萄酒类别之间的样本数量是否存在明显差异。

十、分析不同类别的特征差异

仅查看整体统计数据还不够,因为Wine数据集的核心任务是区分不同类别的葡萄酒。

可以按照target进行分组:

Python
运行
grouped = df.groupby("target")

print(grouped["alcohol"].mean())

如果希望同时观察多个特征,可以使用:

Python
运行
print(
    df.groupby("target")[
        ["alcohol", "malic_acid", "magnesium", "flavanoids", "proline"]
    ].mean()
)

这种方法可以帮助判断不同类别在特定化学指标上的平均水平是否存在差异。

例如,可以比较不同类别的Alcohol平均值:

Python
运行
print(df.groupby("target")["alcohol"].mean())

再比较Proline:

Python
运行
print(df.groupby("target")["proline"].mean())

通过分组统计,可以初步寻找可能具有分类价值的特征。

十一、使用直方图观察特征分布

直方图适合查看单个特征的数据分布。

例如观察Alcohol:

Python
运行
import matplotlib.pyplot as plt

plt.hist(df["alcohol"], bins=15)

plt.xlabel("Alcohol")
plt.ylabel("Frequency")
plt.title("Alcohol Distribution")

plt.show()

如果希望一次查看多个特征,可以选择几个具有代表性的字段:

Python
运行
df[
    ["alcohol", "malic_acid", "magnesium", "proline"]
].hist(
    bins=15,
    figsize=(10, 8)
)

plt.tight_layout()
plt.show()

通过直方图,可以发现某些特征可能呈现偏态分布,也可以观察数据是否存在明显的集中区域。

十二、使用箱线图发现异常值

箱线图可以帮助分析数据的分布范围以及潜在异常值。

例如:

Python
运行
import matplotlib.pyplot as plt

plt.boxplot(df["proline"])

plt.ylabel("Proline")
plt.title("Proline Boxplot")

plt.show()

也可以同时绘制多个特征:

Python
运行
df[
    ["alcohol", "magnesium", "flavanoids", "proline"]
].plot(
    kind="box",
    figsize=(10, 6)
)

plt.show()

需要注意,不同特征的数值范围可能差异很大。因此多个字段放在同一张箱线图中时,某些小尺度特征可能不够明显。

发现潜在异常值后,也不要直接删除。应结合业务背景、数据来源和统计方法进一步判断。

十三、使用相关性矩阵探索特征关系

特征之间的相关关系也是数据探索的重要部分。

可以使用Pandas计算相关系数矩阵:

Python
运行
corr = df.drop(columns=["target"]).corr()

print(corr)

如果希望通过热力图直观展示,可以使用Seaborn:

Python
运行
import seaborn as sns
import matplotlib.pyplot as plt

plt.figure(figsize=(12, 9))

sns.heatmap(
    corr,
    annot=False,
    cmap="coolwarm"
)

plt.title("Wine Feature Correlation")
plt.show()

相关系数接近1通常表示两个特征具有较强的正相关关系,接近-1表示较强的负相关关系,而接近0则说明线性相关程度较弱。

不过,相关系数主要描述线性关系,并不能证明两个变量之间存在因果关系。

十四、使用散点图观察类别之间的区别

选择两个特征绘制散点图,可以直观看到不同类别的样本分布。

例如使用Alcohol和Color intensity:

Python
运行
import matplotlib.pyplot as plt

for target in sorted(df["target"].unique()):
    subset = df[df["target"] == target]

    plt.scatter(
        subset["alcohol"],
        subset["color_intensity"],
        label=f"Class {target}"
    )

plt.xlabel("Alcohol")
plt.ylabel("Color Intensity")
plt.title("Wine Dataset Feature Distribution")
plt.legend()

plt.show()

如果不同类别在二维空间中形成相对独立的区域,说明选择的两个特征可能具有一定分类能力。

这种探索方法也有助于理解后续分类模型为什么能够识别不同类别。

十五、使用Pandas快速完成完整探索

对于刚开始学习数据分析的用户,可以把常用操作组合起来:

Python
运行
from sklearn.datasets import load_wine
import pandas as pd

wine = load_wine()

df = pd.DataFrame(
    wine.data,
    columns=wine.feature_names
)

df["target"] = wine.target

print("数据规模:", df.shape)
print("
数据预览:")
print(df.head())

print("
数据结构:")
df.info()

print("
描述性统计:")
print(df.describe())

print("
缺失值:")
print(df.isnull().sum())

print("
类别数量:")
print(df["target"].value_counts())

这段代码可以作为Wine数据集探索的基础模板。

十六、Wine数据集适合做哪些机器学习实验

完成数据探索后,Wine数据集还可以继续用于多种机器学习实验。

例如分类任务:

Python
运行
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

X = wine.data
y = wine.target

X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
    stratify=y
)

model = DecisionTreeClassifier(random_state=42)

model.fit(X_train, y_train)

y_pred = model.predict(X_test)

print("准确率:", accuracy_score(y_test, y_pred))

这里的X表示输入特征,y表示目标类别。

使用stratify=y可以让训练集和测试集尽量保持与原始数据相近的类别比例,这对于分类实验更加合理。

十七、为什么需要进行特征标准化

Wine数据集中的不同特征量纲并不一致。例如Alcohol、Magnesium和Proline的数值范围明显不同。

对于K近邻、支持向量机、逻辑回归等依赖距离或特征尺度的算法,通常建议进行标准化。

可以使用StandardScaler:

Python
运行
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

X_scaled = scaler.fit_transform(wine.data)

print(X_scaled[:5])

标准化后,各特征会转换到相对统一的尺度。

需要注意,标准化操作应该先对训练集执行fit,再使用相同的转换规则处理测试集,避免测试集信息泄漏。

实际建模时可以使用Pipeline:

Python
运行
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression

model = Pipeline([
    ("scaler", StandardScaler()),
    ("classifier", LogisticRegression(max_iter=1000))
])

model.fit(X_train, y_train)

print(model.score(X_test, y_test))

这种写法能够把数据预处理和模型训练连接起来,降低数据处理流程出错的概率。

十八、探索Wine数据集时的常见问题

1. 找不到load_wine函数

确保导入方式正确:

Python
运行
from sklearn.datasets import load_wine

同时检查scikit-learn是否已经安装。

2. 把target当作普通特征分析

target是模型需要预测的类别,不属于原始输入特征。

因此计算特征相关性时,通常应该排除它:

Python
运行
df.drop(columns=["target"]).corr()

3. 直接使用原始数据训练所有模型

不同机器学习算法对特征尺度的敏感程度不同。对于需要考虑特征距离或权重的算法,建议根据模型特点进行标准化。

4. 只查看head就开始建模

head()只能查看前几条记录,无法反映完整数据结构。更合理的探索流程应该包括数据规模、数据类型、缺失值、类别分布、统计特征以及变量之间的关系。

十九、一个完整的Wine数据集探索示例

下面给出一个更加完整的示例,适合保存为Python脚本直接运行:

Python
运行
from sklearn.datasets import load_wine
import pandas as pd
import matplotlib.pyplot as plt

# 加载数据
wine = load_wine()

# 转换为DataFrame
df = pd.DataFrame(
    wine.data,
    columns=wine.feature_names
)

df["target"] = wine.target

# 基本信息
print("数据维度:", df.shape)
print("
前5条数据:")
print(df.head())

print("
数据统计:")
print(df.describe())

print("
缺失值统计:")
print(df.isnull().sum())

print("
类别分布:")
print(df["target"].value_counts().sort_index())

# 类别分布图
df["target"].value_counts().sort_index().plot(kind="bar")

plt.xlabel("Wine Class")
plt.ylabel("Count")
plt.title("Wine Dataset Class Distribution")
plt.show()

# Alcohol分布
plt.hist(df["alcohol"], bins=15)

plt.xlabel("Alcohol")
plt.ylabel("Frequency")
plt.title("Alcohol Distribution")
plt.show()

# 特征相关性
print("
特征相关性:")
print(df.drop(columns=["target"]).corr())

通过这套流程,可以完成Wine数据集从加载、转换、检查到基础分析的主要步骤。

二十、Wine数据集探索的推荐流程

实际学习过程中,可以按照下面的顺序进行:

加载Wine数据集
       ↓
查看样本数量和特征数量
       ↓
转换为Pandas DataFrame
       ↓
检查数据类型和缺失值
       ↓
查看描述性统计
       ↓
分析类别分布
       ↓
比较不同类别的特征
       ↓
绘制直方图和箱线图
       ↓
分析特征相关性
       ↓
绘制散点图观察类别
       ↓
进行特征预处理
       ↓
进入机器学习建模

这样的顺序能够避免一上来就训练模型,而是先理解数据本身。对于机器学习初学者而言,掌握数据探索流程往往比记住某个具体模型的代码更加重要。

Wine数据集虽然规模较小,但同时包含多维数值特征和多个分类标签,非常适合练习Python数据分析的完整流程。通过load_wine()可以快速完成数据加载,再结合Pandas进行数据整理,利用Matplotlib或Seaborn进行可视化,就能从数据规模、特征分布、类别差异和相关性等多个角度建立对数据的整体认识。完成这些步骤后,再进入标准化、特征选择和分类模型训练,整个机器学习实验过程会更加清晰。