前言

文章相关资源可参考我的GitCode仓库:https://gitcode.com/Morse_Chen/Python_data_analysis

一、实验目的与要求

1、目的:

  理解使用Scikit-Learn库构建数据分析模型的一般过程,掌握线形回归分析的基本原理和主要优缺点,能对给定的数据集进行线形回归分析。

2、要求:

  应用Scikit-Learn库中的LinearRegression类对加州大学机器学习库的酒数据集 (https://archive-beta.ics.uci.edu/dataset/186/wine+quality) 进行回归分析,并评估回归结果的性能。
  具体来说,该数据集包含了1599种不同红酒的11种物理化学属性,每种酒的质量由真人打分,分数范围从0到10,0代表质量最差,10代表最好。现在希望基于已有酒的物理化学属性来预测未知酒的质量,因此该问题可以看作一个回归问题。
  训练数据包含的属性有:非挥发性酸、挥发性酸、柠檬酸、剩余糖分、氯化物、单体硫、总二氧化硫、密度、pH值、硫酸盐、酒精含量和质量。可以把质量看成目标变量,其他属性看成自变量进行学习。

数据集winequality-red.csv下载地址:
链接:https://pan.quark.cn/s/e19c3d7c4ff2
提取码:LmQR

二、实验步骤

  1. 从winequality-red.csv文件中读入输入到一个Pandas对象中,并查看数据的基本情况。
  2. 分析自变量与目标变量 (质量) 的相关性。
  3. 通过散点图重点分析酒精含量与质量的相关性、挥发性酸与质量的相关性,可以得出什么结论?
  4. 将数据集按75%和25%的比例分成训练集和测试集,进行回归分析,并给出模型训练的性能评估。
  5. 思考:能否使用交叉验证改进模型学习的效果?

三、主要程序清单和运行结果

(一)创建DataFrame并查看数据

从winequality-red.csv文件中读入输入到一个Pandas对象中,并查看数据的基本情况。

import pandas as pd
# 读入数据
winequality = pd.read_csv('winequality-red.csv',sep=';')
winequality.head(10)

在这里插入图片描述

# 查看数据的基本情况
winequality.info()   # 查看数据的基本信息,比如数据类型和缺失值情况

在这里插入图片描述

# 查看数据的统计摘要信息,比如平均值、最大值、最小值等
winequality.describe()
fixed acidityvolatile aciditycitric acidresidual sugarchloridesfree sulfur dioxidetotal sulfur dioxidedensitypHsulphatesalcoholquality
count1599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.0000001599.000000
mean8.3196370.5278210.2709762.5388060.08746715.87492246.4677920.9967473.3111130.65814910.4229835.636023
std1.7410960.1790600.1948011.4099280.04706510.46015732.8953240.0018870.1543860.1695071.0656680.807569
min4.6000000.1200000.0000000.9000000.0120001.0000006.0000000.9900702.7400000.3300008.4000003.000000
25%7.1000000.3900000.0900001.9000000.0700007.00000022.0000000.9956003.2100000.5500009.5000005.000000
50%7.9000000.5200000.2600002.2000000.07900014.00000038.0000000.9967503.3100000.62000010.2000006.000000
75%9.2000000.6400000.4200002.6000000.09000021.00000062.0000000.9978353.4000000.73000011.1000006.000000
max15.9000001.5800001.00000015.5000000.61100072.000000289.0000001.0036904.0100002.00000014.9000008.000000
#查看每对属性之间的标准相关系数
winequality.corr()

在这里插入图片描述

(二)分析自变量与目标变量的相关性

分析自变量与目标变量 (质量) 的相关性。

winequality.corr()

在这里插入图片描述

# 计算相关系数
winequality.corr()['quality'].sort_values(ascending=False)

在这里插入图片描述

(三)进行单变量的线性回归

通过散点图重点分析酒精含量与质量的相关性、挥发性酸与质量的相关性,可以得出什么结论?

from sklearn.linear_model import LinearRegression

# 使用线性回归拟合酒精含量与质量的数据
alcohol = winequality['alcohol'].values.reshape(-1, 1)
quality = winequality['quality'].values.reshape(-1, 1)
reg_alcohol = LinearRegression().fit(alcohol, quality)

# 绘制酒精含量与质量的散点图和拟合曲线
plt.figure(figsize=(10, 5))
plt.scatter(winequality['alcohol'], winequality['quality'], color='blue', label='Data')
plt.plot(alcohol, reg_alcohol.predict(alcohol), color='green', linewidth=2, label='Fit')
plt.title('Scatter Plot of Alcohol Content vs Quality with Fit Line')
plt.xlabel('Alcohol Content')
plt.ylabel('Quality')
plt.legend()
plt.grid(True)
plt.show()

# 使用线性回归拟合挥发性酸与质量的数据
volatile_acidity = winequality['volatile acidity'].values.reshape(-1, 1)
reg_volatile_acidity = LinearRegression().fit(volatile_acidity, quality)

# 绘制挥发性酸与质量的散点图和拟合曲线
plt.figure(figsize=(10, 5))
plt.scatter(winequality['volatile acidity'], winequality['quality'], color='red', label='Data')
plt.plot(volatile_acidity, reg_volatile_acidity.predict(volatile_acidity), color='green', linewidth=2, label='Fit')
plt.title('Scatter Plot of Volatile Acidity vs Quality with Fit Line')
plt.xlabel('Volatile Acidity')
plt.ylabel('Quality')
plt.legend()
plt.grid(True)
plt.show()

在这里插入图片描述

结论:

  • 酒精含量与质量的相关性:从散点图中可以看出,酒精含量与质量呈正相关关系,即酒精含量较高的葡萄酒往往具有较高的质量评分。

  • 挥发性酸与质量的相关性:在挥发性酸与质量的散点图中,存在一个负相关趋势,即挥发性酸含量较低的葡萄酒可能具有较高的质量评分。

(四)进行多变量的回归分析

将数据集按75%和25%的比例分成训练集和测试集,进行回归分析,并给出模型训练的性能评估。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt

# 加载数据集
winequality = pd.read_csv('winequality-red.csv',sep=';')

# 指定自变量(特征变量)和因变量(目标变量)
X = winequality[['alcohol', 'volatile acidity']]
y = winequality['quality']

# 将数据集分割成训练集和测试集(75%训练集,25%测试集)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=42)

# 初始化线性回归模型
model = LinearRegression()

# 在训练集上训练模型
model.fit(X_train, y_train)

# 在测试集上进行预测
y_pred = model.predict(X_test)

# 计算均方误差(Mean Squared Error)
mse = mean_squared_error(y_test, y_pred)

# 计算R^2分数
r2 = r2_score(y_test, y_pred)

# 打印性能评估结果
print("均方误差(MSE):", mse)
print("R^2分数:", r2)

# 绘制预测值与实际值的散点图
plt.figure(figsize=(10, 5))
plt.scatter(y_test, y_pred)
plt.plot([min(y_test), max(y_test)], [min(y_test), max(y_test)], '--', color='red')
plt.title('Actual vs Predicted')
plt.xlabel('Actual')
plt.ylabel('Predicted')
plt.grid(True)
plt.show()

在这里插入图片描述

均方误差(Mean Squared Error,MSE):该值衡量模型预测值与实际观测值之间的平方差的平均值。MSE值越低,表示模型的预测性能越好。

R 2 R^2 R2分数: R 2 R^2 R2分数是拟合优度的一种度量,表示模型对目标变量方差的解释程度。该值范围从0到1,越接近1表示模型拟合得越好。

(五)改进模型学习的效果

思考:能否使用交叉验证改进模型学习的效果?

交叉验证是一种评估模型性能和泛化能力的有效方法,它可以帮助我们更好地理解模型在未见过数据上的表现。下面是如何使用交叉验证改进线性回归模型的学习效果的步骤:

  1. 导入必要的库:首先,导入cross_val_score函数,它可以用于执行交叉验证并返回每个折叠的评分。
  2. 执行交叉验证:使用cross_val_score函数对模型进行交叉验证。你可以指定交叉验证的折叠数量(例如,5折交叉验证)。
  3. 评估性能:对于每个交叉验证折叠,计算评分(例如,R^2分数),并最终计算所有折叠的平均分数。
# 使用交叉验证改进模型学习的效果

import pandas as pd
from sklearn.model_selection import KFold, cross_val_score
from sklearn.linear_model import LinearRegression

# 加载数据集
winequality = pd.read_csv('winequality-red.csv', sep=';')

# 准备自变量(特征值)和目标变量
X = winequality[['alcohol', 'volatile acidity']]
y = winequality['quality']

# 初始化线性回归模型
model = LinearRegression()

# 定义K折交叉验证的折数
k = 5

# 初始化KFold对象
kf = KFold(n_splits=k, shuffle=True, random_state=42)

# 执行交叉验证
cv_scores = cross_val_score(model, X, y, cv=kf)

# 计算并打印平均得分和标准差
mean_score = cv_scores.mean()
std_score = cv_scores.std()
print(f"交叉验证{k}-折得分: {cv_scores}")
print(f"均方误差(MSE): {mean_score:.2f}")
print(f"R^2分数: {std_score:.2f}")

在这里插入图片描述

通过交叉验证,我们可以更可靠地评估模型的性能,并且可以更好地了解模型在不同数据子集上的表现情况,从而提高模型的泛化能力。

四、实验体会

  通过这次实验,了解了基于Scikit-Learn构建数据分析模型是一种非常实用的技能,可以帮助我们快速构建高效准确的数据模型,从而更好地分析和利用数据。
  在实际的数据分析中,往往需要对原始数据进行处理和清洗。这包括缺失值处理、异常值处理、重复值处理等。Python中有很多常用的工具库可以帮助我们完成这些任务,例如pandas、numpy等。特征工程是数据分析中非常重要的一部分,它包括特征提取、特征选择和特征转换等。在实际应用中,我们需要根据具体场景来选择合适的特征工程方法。
  Scikit-Learn提供了很多常用的机器学习模型,包括决策树、支持向量机、逻辑回归等。在实际应用中,我们需要根据具体场景选择合适的模型,并对模型进行调优。本次实验运用了线性回归,这是一种常见且重要的数据分析方法。通过对线性关系进行建模,我们可以预测和理解变量之间的关系。通过对数据进行探索、选择合适的特征、建立模型并进行评估,我们可以从中获取有价值的信息,并作出预测和解释。在实践中,不断改进和优化模型,可以提高模型的准确性和应用能力。在完成模型的训练和调优后,我们需要对模型进行评估和预测。这包括模型准确度评估、ROC曲线绘制、混淆矩阵等。
  总之,在Python数据分析中,我们需要掌握数据处理和清洗、特征工程、模型选择和调优、模型评估和预测等多个方面的知识。同时,我们还需要具备良好的编程能力和数据分析思维,才能更好地完成实验任务。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐