
Python数据分析实验三:基于Scikit-Learn构建数据分析模型
Python大数据分析与挖掘 实验三:基于Scikit-Learn构建数据分析模型。
目录
前言
文章相关资源可参考我的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
二、实验步骤
- 从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数据分析中,我们需要掌握数据处理和清洗、特征工程、模型选择和调优、模型评估和预测等多个方面的知识。同时,我们还需要具备良好的编程能力和数据分析思维,才能更好地完成实验任务。
更多推荐
所有评论(0)