【机器学习】任务三:基于逻辑回归与线性回归的鸢尾花分类与波士顿房价预测分析

目录

1.目的和要求

1.1 掌握回归分析的概念和使用场景

1.2 掌握机器学习回归分析进行数据预测的有效方法

1.3 掌握特征重要性分析、特征选择和模型优化的方法

2.波士顿房价预测与特征分析

2.1第一步:导入所需的模块和包

2.2 第二步:加载波士顿房价数据集

2.3 第三步:数据预处理与分割

2.4 第四步:建立并训练线性回归模型

2.5 第五步:进行预测并评估模型

2.6 第六步:可视化真实值与预测值的关系

2.7 第七步:残差分析

2.5 第八步:特征相关性分析

2.9 第九步:特征重要性分析

3.鸢尾花数据集的逻辑回归分析

3.1 步骤 1:导入所需的模块与包

3.2 步骤 2:加载鸢尾花数据集

3.3 步骤 3:数据探索与可视化

3.4 步骤 4:数据集划分

3.5 步骤 5:训练逻辑回归模型

3.6 步骤 6:预测与评估模型

3.7 步骤 7:可视化逻辑回归决策边界

3.8 结果分析

4.总体代码和结果

4.1波士顿

4.1.1 波士顿代码

4.1.2 波士顿代码结果

4.3.3 波士顿房价预测模型结果分析

4.2 鸢尾花

4.2.1  鸢尾花代码

4.2.2 鸢尾花代码运行结果

4.2.3  鸢尾花模型结果分析


1.目的和要求

1.1 掌握回归分析的概念和使用场景

回归分析 是一种统计方法,用于理解变量之间的关系,尤其是通过一个或多个自变量(特征)来预测目标变量(因变量)。在机器学习中,回归分析主要用于连续值的预测。

使用场景

  • 房价预测:根据房屋的面积、位置、房龄等特征来预测房价。
  • 销售预测:通过历史销售数据、市场状况等预测未来的销售额。
  • 股票市场预测:根据市场指标和历史价格预测未来的股票价格。
  • 能耗预测:根据天气和设备参数,预测未来的能耗需求。

回归分析的核心目标是寻找输入变量和目标输出变量之间的关系,以最小化误差。

1.2 掌握机器学习回归分析进行数据预测的有效方法

在机器学习中,常用的回归方法包括线性回归、岭回归、LASSO回归和多项式回归等。你可以通过以下几个步骤来有效进行数据预测:

常用的回归模型:

  • 线性回归:假设自变量与因变量之间存在线性关系,适用于简单且明确的线性问题。
  • 岭回归(Ridge Regression):在线性回归的基础上加上L2正则化,用于解决多重共线性问题。
  • LASSO回归(Least Absolute Shrinkage and Selection Operator):加上L1正则化,可以使某些系数变为0,具有特征选择功能。
  • 多项式回归:适用于非线性数据,可以通过增加特征的多项式项来提高预测效果。
  • 支持向量回归(SVR):用于非线性回归问题,通过核函数将数据映射到高维空间进行线性回归。

回归分析步骤:

  1. 数据预处理:检查数据的完整性,处理缺失值,归一化或标准化数据。
  2. 特征选择:从众多自变量中选择与目标变量相关性较高的变量进行建模,减少模型的复杂性。
  3. 数据集划分:将数据划分为训练集和测试集(常见划分比例为80:20),确保模型的泛化能力。
  4. 模型选择:根据数据特点选择合适的回归模型。
  5. 模型评估:使用均方误差(MSE)、R²值、平均绝对误差(MAE)等指标评估模型的效果。
  6. 模型优化:通过调整模型的参数(如正则化系数)、交叉验证和网格搜索等方法来优化模型。

1.3 掌握特征重要性分析、特征选择和模型优化的方法

特征重要性分析:

在回归模型中,特征的重要性可以通过以下方法评估:

  • 线性回归系数:线性回归模型中的系数值反映了每个特征对预测结果的影响大小。
  • 基于树的模型(例如随机森林和梯度提升树):这些模型能够直接输出特征的重要性。树模型通过拆分点的重要性来评估特征的贡献。
# 特征重要性分析代码示例
coefficients = pd.Series(model.coef_, index=X.columns)
coefficients = coefficients.sort_values(ascending=False)
plt.figure(figsize=(10, 6))
coefficients.plot(kind='barh')
plt.title('特征重要性分析', fontproperties=font)
plt.xlabel('系数值', fontproperties=font)
plt.ylabel('特征', fontproperties=font)
plt.show()

特征选择:

特征选择是通过减少不重要的特征来简化模型,提升预测的准确性和泛化能力的方法。常用的特征选择方法有:

  • 过滤法:使用统计方法(如皮尔逊相关系数、卡方检验等)来选择与目标变量相关性较高的特征。
  • 包裹法:通过模型进行评估,选择能最大化模型表现的特征组合,例如递归特征消除(RFE)。
  • 嵌入法:模型训练时自动选择重要特征,例如LASSO回归。

模型优化:

模型优化是提升模型预测能力的关键,以下是几种常用的优化方法:

  • 正则化:通过添加L1或L2正则化项,防止模型过拟合。
  • 超参数调整:通过网格搜索(Grid Search)或随机搜索(Random Search)寻找最佳的超参数组合。
  • 交叉验证:将数据分成多折进行训练和验证,避免模型在某个固定训练集上过拟合。
# 交叉验证代码示例
from sklearn.model_selection import cross_val_score
cv_scores = cross_val_score(model, X, y, cv=10, scoring='neg_mean_squared_error')
cv_scores_mean = -cv_scores.mean()
print(f'10折交叉验证的平均MSE:{cv_scores_mean}')

总结:

  1. 回归分析:用于分析特征与目标变量之间的关系,常用于连续变量的预测任务。
  2. 数据预测:通过机器学习的回归模型,进行模型选择、训练和评估,提升预测效果。
  3. 特征重要性与模型优化:通过特征选择、正则化、超参数调整和交叉验证,简化模型并提升预测能力。

2.波士顿房价预测与特征分析

2.1第一步:导入所需的模块和包

我们首先需要导入机器学习项目中常用的库,这些库用于数据处理、建模和可视化。

# 导入必要的库
import pandas as pd  # 用于数据处理
import numpy as np  # 用于科学计算
import matplotlib.pyplot as plt  # 用于绘制图形
import seaborn as sns  # 用于绘制高级图形
from sklearn.model_selection import train_test_split  # 用于分割训练集和测试集
from sklearn.linear_model import LinearRegression  # 用于构建线性回归模型
from sklearn.metrics import mean_squared_error, r2_score  # 用于模型评估
from matplotlib.font_manager import FontProperties  # 用于设置中文字体

解释:

  • pandas 用于数据的加载、处理和分析。
  • numpy 用于执行数学计算。
  • matplotlib.pyplotseaborn 用于数据的可视化。
  • train_test_split 用于将数据集划分为训练集和测试集。
  • LinearRegression 是线性回归模型的构建模块。
  • mean_squared_errorr2_score 用于评估模型性能。

2.2 第二步:加载波士顿房价数据集

我们使用 TensorFlow 的 Keras 库从波士顿房价数据集中加载数据并将其分割为特征与目标变量。

# 加载本地数据集
file_path = r'C:\Users\Administrator\Desktop\ML\机器学习\实验任务二\data\boston_housing.csv'
df = pd.read_csv(file_path)

# 数据探索
print(df.head())  # 查看数据前5行
print(df.describe())  # 查看数据统计信息
print(df.columns)  # 查看数据集的列名

解释:

  • pd.read_csv() 用于从 CSV 文件中加载数据。
  • df.head() 用于查看数据的前5行,了解数据的基本结构。
  • df.describe() 提供了数值型数据的描述统计信息,如平均值、标准差等。
  • df.columns 打印数据集的列名,确保列名正确。

2.3 第三步:数据预处理与分割

在进行建模之前,我们需要处理数据,将特征与目标变量分开,并将数据集划分为训练集和测试集。

# 检查是否有缺失值
print(df.isnull().sum())  # 输出每个特征的缺失值数量

# 分割特征和目标变量
X = df.drop('MEDV', axis=1)  # 'MEDV'是目标变量,表示房价
y = df['MEDV']

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

解释:

  • df.isnull().sum() 检查数据集中是否存在缺失值,确保数据质量。
  • X = df.drop('MEDV', axis=1) 移除目标变量(房价),X 是特征矩阵。
  • y = df['MEDV'] 将目标变量提取出来。
  • train_test_split 用于将数据集划分为训练集和测试集,其中 20% 的数据作为测试集。

2.4 第四步:建立并训练线性回归模型

我们使用线性回归模型对数据进行训练,训练集用于模型的拟合。

# 创建线性回归模型
model = LinearRegression()

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

解释:

  • LinearRegression() 创建线性回归模型的实例。
  • model.fit(X_train, y_train) 通过训练数据对模型进行训练,调整模型参数,使得模型可以根据训练数据预测房价。

2.5 第五步:进行预测并评估模型

模型训练完成后,使用测试集进行预测,并使用均方误差(MSE)和 R²值来评估模型性能。

# 使用测试集进行预测
y_pred = model.predict(X_test)

# 评估模型性能
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# 打印评估结果
print(f'均方误差(MSE):{mse}')
print(f'R²值:{r2}')

解释:

  • model.predict(X_test) 使用训练好的模型对测试集进行预测。
  • mean_squared_error() 计算均方误差,衡量模型预测的误差大小,误差越小,模型越好。
  • r2_score() 计算 R²值,表示模型解释数据变化的比例,值越接近 1 表示模型越好。

2.6 第六步:可视化真实值与预测值的关系

我们通过散点图展示真实房价与预测房价的关系,理想情况下,散点应接近对角线。

# 可视化真实房价与预测房价
plt.scatter(y_test, y_pred)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)  # 绘制对角线
plt.xlabel('实际房价', fontproperties=font)
plt.ylabel('预测房价', fontproperties=font)
plt.title('实际房价 vs 预测房价', fontproperties=font)
plt.show()

解释:

  • plt.scatter() 用于绘制散点图,横坐标为实际房价,纵坐标为预测房价。
  • plt.plot() 绘制一条对角线,表示理想情况下预测值应与实际值一致。
  • 如果散点接近对角线,说明模型的预测效果较好。

2.7 第七步:残差分析

残差是指预测值与实际值之间的差距。我们通过柱状图分析残差的分布,检查模型是否存在系统性偏差。

# 残差分析
residuals = y_test - y_pred
plt.hist(residuals, bins=20)
plt.xlabel('残差', fontproperties=font)
plt.ylabel('频数', fontproperties=font)
plt.title('残差分布', fontproperties=font)
plt.show()

解释:

  • residuals = y_test - y_pred 计算残差,即实际值与预测值的差。
  • plt.hist() 绘制残差的分布直方图,观察其分布是否接近正态分布。

2.5 第八步:特征相关性分析

通过热力图分析特征之间的相关性,以便了解哪些特征之间存在较强的线性关系。

# 特征相关性分析
corr_matrix = df.corr()
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('特征相关性热力图', fontproperties=font)
plt.show()

解释:

  • df.corr() 计算数据集中每个特征之间的相关性系数。
  • sns.heatmap() 绘制热力图,颜色越深表示相关性越强,帮助我们直观地理解特征之间的关系。

2.9 第九步:特征重要性分析

我们通过线性回归模型的系数来分析各个特征对房价预测的影响,并通过条形图展示特征的重要性。

# 特征重要性分析
coefficients = pd.Series(model.coef_, index=X.columns)
coefficients = coefficients.sort_values(ascending=False)
plt.figure(figsize=(10, 6))
coefficients.plot(kind='barh')
plt.title('特征重要性分析', fontproperties=font)
plt.xlabel('系数值', fontproperties=font)
plt.ylabel('特征', fontproperties=font)
plt.show()

解释:

  • model.coef_ 返回线性回归模型中每个特征的系数,系数越大表示该特征对预测结果的影响越大。
  • coefficients.plot(kind='barh') 绘制条形图,显示特征的重要性排序。

3.鸢尾花数据集的逻辑回归分析

3.1 步骤 1:导入所需的模块与包

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from matplotlib.font_manager import FontProperties

解释:

  • sklearn.datasets:用于加载鸢尾花数据集。
  • train_test_split:用于将数据集划分为训练集和测试集。
  • LogisticRegression:逻辑回归模型,用于多分类任务。
  • classification_reportconfusion_matrix:用于模型的评估,提供分类报告和混淆矩阵。
  • matplotlibseaborn:用于可视化,包括绘制特征关系图和混淆矩阵。
  • numpypandas:用于数据操作和处理。
  • FontProperties:用于设置图表中的中文字体。

3.2 步骤 2:加载鸢尾花数据集

# 设置中文字体
font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf')  # 修改为系统中中文字体的路径

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names
target_names = iris.target_names

解释:

  • 加载数据集load_iris() 用于加载鸢尾花数据集。X 是特征矩阵,y 是标签。feature_namestarget_names 分别是特征和标签的名称。
  • 中文字体:通过 FontProperties 设置中文字体,确保可视化图表中的中文能够正常显示。

3.3 步骤 3:数据探索与可视化

# 数据探索
df = pd.DataFrame(X, columns=feature_names)
df['Species'] = y
print(df.head())

# 特征关系可视化
sns.pairplot(df, hue='Species')
plt.show()

解释:

  • 数据探索:将数据集转换为 DataFrame 格式,方便数据查看与操作。通过 print(df.head()) 查看数据的前几行。
  • 特征关系可视化:通过 sns.pairplot() 展示各特征之间的关系图,按照不同的鸢尾花种类(Species)进行颜色区分,有助于理解特征之间的分布和相关性。

3.4 步骤 4:数据集划分

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

解释:

  • 划分训练集和测试集:使用 train_test_split() 函数,将数据集按 70% 训练集和 30% 测试集划分。通过设置 random_state=42,确保划分结果是可重复的。

3.5 步骤 5:训练逻辑回归模型

# 训练逻辑回归模型
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)

解释:

  • 模型创建与训练:创建逻辑回归模型对象 LogisticRegression() 并在训练集上进行训练。max_iter=200 设置了最大迭代次数为 200,以确保模型能够收敛。

3.6 步骤 6:预测与评估模型

# 预测并评估模型
y_pred = model.predict(X_test)

# 混淆矩阵和分类报告
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=target_names, yticklabels=target_names)
plt.xlabel('预测值', fontproperties=font)
plt.ylabel('实际值', fontproperties=font)
plt.title('混淆矩阵', fontproperties=font)
plt.show()

print(classification_report(y_test, y_pred, target_names=target_names))

解释:

  • 预测:使用训练好的模型在测试集上进行预测,得到预测标签 y_pred
  • 混淆矩阵confusion_matrix() 生成混淆矩阵,展示模型预测结果和实际值的匹配情况。通过 sns.heatmap() 绘制热图,直观展示混淆矩阵的结果。
  • 分类报告:通过 classification_report() 输出分类报告,包含精确率、召回率、F1 值等评估指标。

3.7 步骤 7:可视化逻辑回归决策边界

# 可视化逻辑回归决策边界(选取两个特征)
X_two_features = X[:, :2]  # 选择两个特征
X_train, X_test, y_train, y_test = train_test_split(X_two_features, y, test_size=0.3, random_state=42)
model.fit(X_train, y_train)

x_min, x_max = X_two_features[:, 0].min() - 1, X_two_features[:, 0].max() + 1
y_min, y_max = X_two_features[:, 1].min() - 1, X_two_features[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Paired)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('花萼长度(cm)', fontproperties=font)
plt.ylabel('花萼宽度(cm)', fontproperties=font)
plt.title('逻辑回归决策边界', fontproperties=font)
plt.show()

解释:

  • 选择两个特征:为了便于可视化,只选取前两个特征(花萼长度和花萼宽度)来绘制决策边界。
  • 绘制决策边界:使用 np.meshgrid() 创建网格,通过模型对网格上的每个点进行预测,使用 contourf() 绘制决策边界。通过 scatter() 绘制测试集中样本点的分布情况,进一步展示模型在二维平面上的分类效果。

3.8 结果分析

  1. 模型评估

    • 混淆矩阵展示了模型在三类鸢尾花上的分类效果。大部分样本分类正确,显示了模型的良好表现。
    • 分类报告提供了精确率、召回率、F1 值等关键指标,总体而言,模型在分类任务中的表现良好。
  2. 决策边界可视化

    • 决策边界清晰地将不同类别的鸢尾花分隔开来,展示了逻辑回归模型在二维特征空间中的分类效果。
    • 样本点大多数落在正确的分类区域中,进一步验证了模型的分类能力。

4.总体代码和结果

4.1波士顿

4.1.1 波士顿代码

# 导入必要的库
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
import seaborn as sns
from matplotlib.font_manager import FontProperties

# 设置中文字体
font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf')  # 替换为你的系统中的中文字体路径

# 加载本地数据
file_path = r'C:\Users\Administrator\Desktop\ML\机器学习\实验任务二\data\boston_housing.csv'
df = pd.read_csv(file_path)

# 数据探索
print(df.head())
print(df.describe())

# 特征与标签分离
X = df.drop('MEDV', axis=1)  # 特征
y = df['MEDV']  # 目标变量

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建线性回归模型并训练
model = LinearRegression()
model.fit(X_train, y_train)

# 预测并评估模型
y_pred = model.predict(X_test)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'均方误差(MSE):{mse}')
print(f'R²值:{r2}')

# 图 5:可视化真实值与预测值的散点图
plt.figure(figsize=(8, 6))
plt.scatter(y_test, y_pred)
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'r--', lw=2)  # 理想预测线
plt.xlabel('实际房价', fontproperties=font)
plt.ylabel('预测房价', fontproperties=font)
plt.title('实际房价 vs 预测房价', fontproperties=font)
plt.show()

# 图 7:残差分布图
residuals = y_test - y_pred
plt.figure(figsize=(8, 6))
sns.histplot(residuals, kde=True, bins=30)
plt.axvline(residuals.mean(), color='red', linestyle='--', lw=2)
plt.xlabel('残差', fontproperties=font)
plt.ylabel('频数', fontproperties=font)
plt.title('残差分布', fontproperties=font)
plt.show()

# 图 10:特征相关性热力图
corr_matrix = df.corr()
plt.figure(figsize=(12, 10))
sns.heatmap(corr_matrix, annot=True, cmap='coolwarm')
plt.title('特征相关性热力图', fontproperties=font)
plt.show()

# 图 12:特征重要性条形图
coefficients = pd.Series(model.coef_, index=X.columns)
coefficients = coefficients.sort_values(ascending=False)

plt.figure(figsize=(10, 6))
coefficients.plot(kind='barh')
plt.title('特征重要性排序', fontproperties=font)
plt.xlabel('系数值', fontproperties=font)
plt.ylabel('特征', fontproperties=font)
plt.show()

4.1.2 波士顿代码结果

   CRIM    ZN  INDUS  CHAS    NOX     RM   AGE     DIS  RAD  TAX  PTRATIO  \
0  0.00632  18.0   2.31     0  0.538  6.575  65.2  4.0900    1  296     15.3   
1  0.02731   0.0   7.07     0  0.469  6.421  78.9  4.9671    2  242     17.8   
2  0.02729   0.0   7.07     0  0.469  7.185  61.1  4.9671    2  242     17.8   
3  0.03237   0.0   2.18     0  0.458  6.998  45.8  6.0622    3  222     18.7   
4  0.06905   0.0   2.18     0  0.458  7.147  54.2  6.0622    3  222     18.7   

        B  LSTAT  MEDV  
0  396.90   4.98  24.0  
1  396.90   9.14  21.6  
2  392.83   4.03  34.7  
3  394.63   2.94  33.4  
4  396.90   5.33  36.2  
             CRIM          ZN       INDUS        CHAS         NOX          RM  \
count  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000   
mean     3.613524   11.363636   11.136779    0.069170    0.554695    6.284634   
std      8.601545   23.322453    6.860353    0.253994    0.115878    0.702617   
min      0.006320    0.000000    0.460000    0.000000    0.385000    3.561000   
25%      0.082045    0.000000    5.190000    0.000000    0.449000    5.885500   
50%      0.256510    0.000000    9.690000    0.000000    0.538000    6.208500   
75%      3.677083   12.500000   18.100000    0.000000    0.624000    6.623500   
max     88.976200  100.000000   27.740000    1.000000    0.871000    8.780000   

              AGE         DIS         RAD         TAX     PTRATIO           B  \
count  506.000000  506.000000  506.000000  506.000000  506.000000  506.000000   
mean    68.574901    3.795043    9.549407  408.237154   18.455534  356.674032   
std     28.148861    2.105710    8.707259  168.537116    2.164946   91.294864   
min      2.900000    1.129600    1.000000  187.000000   12.600000    0.320000   
25%     45.025000    2.100175    4.000000  279.000000   17.400000  375.377500   
50%     77.500000    3.207450    5.000000  330.000000   19.050000  391.440000   
75%     94.075000    5.188425   24.000000  666.000000   20.200000  396.225000   
max    100.000000   12.126500   24.000000  711.000000   22.000000  396.900000   

            LSTAT        MEDV  
count  506.000000  506.000000  
mean    12.653063   22.532806  
std      7.141062    9.197104  
min      1.730000    5.000000  
25%      6.950000   17.025000  
50%     11.360000   21.200000  
75%     16.955000   25.000000  
max     37.970000   50.000000  
均方误差(MSE):24.29111947497348
R²值:0.6687594935356325

4.3.3 波士顿房价预测模型结果分析

1. 模型评估

  • 均方误差 (MSE):模型的MSE较小,表示预测值与实际房价之间的差距较小,模型在一定程度上准确预测了房价。
  • R²值:R²值表明模型能解释房价变化的主要部分,虽然表现良好,但仍存在部分未解释的变化。整体上,模型对数据的拟合度较好。

2. 可视化分析

  • 真实房价 vs 预测房价散点图:大多数数据点沿对角线分布,表明预测值与实际房价相对接近,模型具有一定的预测能力。但部分散点偏离较大,反映出模型在某些情况下存在预测误差。
  • 残差分布图:残差接近正态分布,说明预测误差较均匀,没有系统性偏差。残差分析显示,模型适用于该数据集。

3. 特征相关性分析

  • 相关性热力图:通过热力图可以看出不同特征之间的相关性。例如,房间数(RM) 与房价正相关,意味着房间数较多的房屋房价较高;而低收入人口比例(LSTAT) 与房价负相关,表示低收入比例越高,房价越低。

4. 特征重要性分析

  • NOX(一氧化氮浓度):对房价的负面影响最大,说明环境污染对房价有显著的负面影响。
  • RM(房间数):对房价的正面影响较大,房间数越多,房价越高。
  • LSTAT(低收入人口比例)DIS(与就业中心的距离):负面影响明显,说明社会经济因素和地理位置对房价有重要作用。

总体来看,模型能够较好地捕捉数据中的关键特征,并合理预测房价。

4.2 鸢尾花

4.2.1  鸢尾花代码

# 导入必要的库
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from matplotlib.font_manager import FontProperties

# 设置中文字体
font = FontProperties(fname=r'C:\Windows\Fonts\simhei.ttf')  # 修改为系统中中文字体的路径

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names
target_names = iris.target_names

# 数据探索
df = pd.DataFrame(X, columns=feature_names)
df['Species'] = y
print(df.head())

# 特征关系可视化
sns.pairplot(df, hue='Species')
plt.show()

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# 训练逻辑回归模型
model = LogisticRegression(max_iter=200)
model.fit(X_train, y_train)

# 预测并评估模型
y_pred = model.predict(X_test)

# 混淆矩阵和分类报告
cm = confusion_matrix(y_test, y_pred)
sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=target_names, yticklabels=target_names)
plt.xlabel('预测值', fontproperties=font)
plt.ylabel('实际值', fontproperties=font)
plt.title('混淆矩阵', fontproperties=font)
plt.show()

print(classification_report(y_test, y_pred, target_names=target_names))

# 可视化逻辑回归决策边界(选取两个特征)
X_two_features = X[:, :2]  # 选择两个特征
X_train, X_test, y_train, y_test = train_test_split(X_two_features, y, test_size=0.3, random_state=42)
model.fit(X_train, y_train)

x_min, x_max = X_two_features[:, 0].min() - 1, X_two_features[:, 0].max() + 1
y_min, y_max = X_two_features[:, 1].min() - 1, X_two_features[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02))

Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.3, cmap=plt.cm.Paired)
plt.scatter(X_test[:, 0], X_test[:, 1], c=y_test, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('花萼长度(cm)', fontproperties=font)
plt.ylabel('花萼宽度(cm)', fontproperties=font)
plt.title('逻辑回归决策边界', fontproperties=font)
plt.show()

4.2.2 鸢尾花代码运行结果

 sepal length (cm)  sepal width (cm)  petal length (cm)  petal width (cm)  \
0                5.1               3.5                1.4               0.2   
1                4.9               3.0                1.4               0.2   
2                4.7               3.2                1.3               0.2   
3                4.6               3.1                1.5               0.2   
4                5.0               3.6                1.4               0.2   

   Species  
0        0  
1        0  
2        0  
3        0  
4        0  

 precision    recall  f1-score   support

      setosa       1.00      1.00      1.00        19
  versicolor       1.00      1.00      1.00        13
   virginica       1.00      1.00      1.00        13

    accuracy                           1.00        45
   macro avg       1.00      1.00      1.00        45
weighted avg       1.00      1.00      1.00        45

4.2.3  鸢尾花模型结果分析

1. 模型评估

  • 准确率:通过分类报告可以看到模型的精确率、召回率和F1值。模型在三个类别上的表现较为均衡,整体分类准确率较高,表明逻辑回归在鸢尾花数据集上的表现良好。

2. 可视化分析

  • 混淆矩阵:混淆矩阵展示了模型的分类效果,大多数数据点被正确分类。少量误分类集中在某些相近类别之间(如Versicolor和Virginica),但总体误差较小。

3. 决策边界可视化

  • 决策边界:通过选取两个特征(花萼长度和花萼宽度)绘制的决策边界图展示了模型的分类能力。不同类别的数据点大部分落在各自的决策区域,说明逻辑回归能够较好地将不同类别的鸢尾花分开。

4. 特征关系分析

  • 特征关系图:通过 pairplot 展示了各个特征的两两关系,不同类别的鸢尾花在某些特征维度上区分明显(如花瓣长度和宽度),这帮助解释了模型能够有效分类的原因。

总体来看,逻辑回归模型在鸢尾花分类任务中表现优异,准确率高,决策边界清晰,分类效果较好。

  • 13
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值