目录
- 一、实验目的与要求
- 二、实验步骤
- 三、主要程序清单和运行结果
- (一)创建DataFrame并查看数据
- (二)分析自变量与目标变量的相关性
- (三)进行单变量的线性回归
- (四)进行多变量的回归分析
- (五)改进模型学习的效果
- 四、实验体会
一、实验目的与要求
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
二、实验步骤
- 从winequality-red.csv文件中读入输入到一个Pandas对象中,并查看数据的基本情况。
- 分析自变量与目标变量 (质量) 的相关性。
- 通过散点图重点分析酒精含量与质量的相关性、挥发性酸与质量的相关性,可以得出什么结论?
- 将数据集按75%和25%的比例分成训练集和测试集,进行回归分析,并给出模型训练的性能评估。
- 思考:能否使用交叉验证改进模型学习的效果?
三、主要程序清单和运行结果
(一)创建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 acidity volatile acidity citric acid residual sugar chlorides free sulfur dioxide total sulfur dioxide density pH sulphates alcohol quality count 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 1599.000000 mean 8.319637 0.527821 0.270976 2.538806 0.087467 15.874922 46.467792 0.996747 3.311113 0.658149 10.422983 5.636023 std 1.741096 0.179060 0.194801 1.409928 0.047065 10.460157 32.895324 0.001887 0.154386 0.169507 1.065668 0.807569 min 4.600000 0.120000 0.000000 0.900000 0.012000 1.000000 6.000000 0.990070 2.740000 0.330000 8.400000 3.000000 25% 7.100000 0.390000 0.090000 1.900000 0.070000 7.000000 22.000000 0.995600 3.210000 0.550000 9.500000 5.000000 50% 7.900000 0.520000 0.260000 2.200000 0.079000 14.000000 38.000000 0.996750 3.310000 0.620000 10.200000 6.000000 75% 9.200000 0.640000 0.420000 2.600000 0.090000 21.000000 62.000000 0.997835 3.400000 0.730000 11.100000 6.000000 max 15.900000 1.580000 1.000000 15.500000 0.611000 72.000000 289.000000 1.003690 4.010000 2.000000 14.900000 8.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表示模型拟合得越好。
(五)改进模型学习的效果
思考:能否使用交叉验证改进模型学习的效果?
交叉验证是一种评估模型性能和泛化能力的有效方法,它可以帮助我们更好地理解模型在未见过数据上的表现。下面是如何使用交叉验证改进线性回归模型的学习效果的步骤:
- 导入必要的库:首先,导入cross_val_score函数,它可以用于执行交叉验证并返回每个折叠的评分。
- 执行交叉验证:使用cross_val_score函数对模型进行交叉验证。你可以指定交叉验证的折叠数量(例如,5折交叉验证)。
- 评估性能:对于每个交叉验证折叠,计算评分(例如,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数据分析中,我们需要掌握数据处理和清洗、特征工程、模型选择和调优、模型评估和预测等多个方面的知识。同时,我们还需要具备良好的编程能力和数据分析思维,才能更好地完成实验任务。
还没有评论,来说两句吧...