Python数据分析实验三:基于Scikit-Learn构建数据分析模型

Python数据分析实验三:基于Scikit-Learn构建数据分析模型

码农世界 2024-05-22 前端 59 次浏览 0个评论

目录

    • 一、实验目的与要求
    • 二、实验步骤
    • 三、主要程序清单和运行结果
      • (一)创建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

        二、实验步骤

        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数据分析中,我们需要掌握数据处理和清洗、特征工程、模型选择和调优、模型评估和预测等多个方面的知识。同时,我们还需要具备良好的编程能力和数据分析思维,才能更好地完成实验任务。

转载请注明来自码农世界,本文标题:《Python数据分析实验三:基于Scikit-Learn构建数据分析模型》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,59人围观)参与讨论

还没有评论,来说两句吧...

Top