【机器学习】任务三:基于逻辑回归与线性回归的鸢尾花分类与波士顿房价预测分析
目录
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):用于非线性回归问题,通过核函数将数据映射到高维空间进行线性回归。
回归分析步骤:
- 数据预处理:检查数据的完整性,处理缺失值,归一化或标准化数据。
- 特征选择:从众多自变量中选择与目标变量相关性较高的变量进行建模,减少模型的复杂性。
- 数据集划分:将数据划分为训练集和测试集(常见划分比例为80:20),确保模型的泛化能力。
- 模型选择:根据数据特点选择合适的回归模型。
- 模型评估:使用均方误差(MSE)、R²值、平均绝对误差(MAE)等指标评估模型的效果。
- 模型优化:通过调整模型的参数(如正则化系数)、交叉验证和网格搜索等方法来优化模型。
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}')
总结:
- 回归分析:用于分析特征与目标变量之间的关系,常用于连续变量的预测任务。
- 数据预测:通过机器学习的回归模型,进行模型选择、训练和评估,提升预测效果。
- 特征重要性与模型优化:通过特征选择、正则化、超参数调整和交叉验证,简化模型并提升预测能力。
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.pyplot
和seaborn
用于数据的可视化。train_test_split
用于将数据集划分为训练集和测试集。LinearRegression
是线性回归模型的构建模块。mean_squared_error
和r2_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_report
和confusion_matrix
:用于模型的评估,提供分类报告和混淆矩阵。matplotlib
和seaborn
:用于可视化,包括绘制特征关系图和混淆矩阵。numpy
和pandas
:用于数据操作和处理。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_names
和target_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 结果分析
-
模型评估:
- 混淆矩阵展示了模型在三类鸢尾花上的分类效果。大部分样本分类正确,显示了模型的良好表现。
- 分类报告提供了精确率、召回率、F1 值等关键指标,总体而言,模型在分类任务中的表现良好。
-
决策边界可视化:
- 决策边界清晰地将不同类别的鸢尾花分隔开来,展示了逻辑回归模型在二维特征空间中的分类效果。
- 样本点大多数落在正确的分类区域中,进一步验证了模型的分类能力。
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 supportsetosa 1.00 1.00 1.00 19versicolor 1.00 1.00 1.00 13virginica 1.00 1.00 1.00 13accuracy 1.00 45macro 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
展示了各个特征的两两关系,不同类别的鸢尾花在某些特征维度上区分明显(如花瓣长度和宽度),这帮助解释了模型能够有效分类的原因。
总体来看,逻辑回归模型在鸢尾花分类任务中表现优异,准确率高,决策边界清晰,分类效果较好。
相关文章:

【机器学习】任务三:基于逻辑回归与线性回归的鸢尾花分类与波士顿房价预测分析
目录 1.目的和要求 1.1 掌握回归分析的概念和使用场景 1.2 掌握机器学习回归分析进行数据预测的有效方法 1.3 掌握特征重要性分析、特征选择和模型优化的方法 2.波士顿房价预测与特征分析 2.1第一步:导入所需的模块和包 2.2 第二步:加载波士顿房价…...

【操作系统存储篇】Linux文件基本操作
目录 一、Linux目录 二、Linux文件的常用操作 三、Linux文件类型 一、Linux目录 Linux有很多目录,Linux一切皆是文件,包括进程、设备等。 相对路径:相对于当前的操作目录,文件位于哪个目录。 绝对路径 :从根目录开…...

C++ | Leetcode C++题解之第387题字符串中的第一个唯一字符
题目: 题解: class Solution { public:int firstUniqChar(string s) {unordered_map<char, int> position;queue<pair<char, int>> q;int n s.size();for (int i 0; i < n; i) {if (!position.count(s[i])) {position[s[i]] i;…...

数学建模--皮尔逊相关系数、斯皮尔曼相关系数
目录 1.总体的皮尔逊相关系数 2.样本的皮尔逊相关系数 3.对于皮尔逊相关系数的认识 4.描述性统计以及corr函数 编辑 5.数据导入实际操作 6.引入假设性检验 6.1简单认识 6.2具体步骤 7.p值判断法 8.检验正态分布 8.1jb检验 8.2威尔克检验:针对于p值进行…...

DAY87 APP 攻防-安卓逆向篇Smail 语法反编译签名重打包Activity 周期Hook 模块
1、APK 逆向-数据修改-结构&格式 2、APK 逆向-逻辑修改-Smail 语法 3、APK 逆向-视图修改-Activity&Xml #章节点: 1、APP 资产-内在提取&外在抓包 2、APP 逆向-反编译&删验证&重打包 3、APP 安全-存储&服务&组件&注册等 演示案例&a…...

jenkins 工具使用
使用方式 替代手动,自动化拉取、集成、构建、测试;是CI/CD持续集成、持续部署主流开发模式中重要的环节;必须组件 jenkins-gitlab,代码公共仓库服务器(至少6G内存);jenkins-server,…...

使用C语言实现字符推箱子游戏
使用C语言实现字符推箱子游戏 推箱子(Sokoban)是一款经典的益智游戏,玩家通过移动角色将箱子推到目标位置。本文将带你一步步用C语言实现一个简单的字符版本的推箱子游戏。 游戏规则 玩家只能推箱子,不能拉箱子。只能将箱子推到…...
用SpringBoot API实现识别pdf文件是否含有表格
要使用Spring Boot API 实现一个识别 PDF 文件是否含有表格的功能,你可以结合 PDF 解析库(如 Apache PDFBox)来解析 PDF 文件内容,并通过分析文本或线条来判断 PDF 是否包含表格。然后使用 Spring Boot 提供的 REST API 来实现上传…...

嵌入式S3C2440:控制LED灯
发光二极管接口(左端)应为低电平 以LED1为例 LED1的接口为GPB5 void led_init(void) {//配置GPB5功能为输出GPBCON & ~(0x3 << 10);GPBCON | (0x1 << 10); //使GPB5输出高电平(关灯)GPBDAT | (1 << 5); }void led_on(void) {GPB…...

算法:区间dp
文章目录 一、适用场景二、基本思路步骤时间复杂度: 三、例题 区间动态规划(Interval DP)是一种用于解决某些需要处理区间或子段问题的动态规划方法,特别适合于问题的解可以通过子区间的解进行组合的情况。该方法的核心思想是在子…...

【14.1运行版】C++俄罗斯方块-实现欢迎界面
实现欢迎界面 #include <stdio.h>//C语言形式的输入输出 #include <graphics.h>//图形库的头文件//实现欢迎界面 void welcome(void);int main(void) {welcome();//colsegraph();return 0; }void welcome(void) {//初始化画布initgraph(550, 660);//设置窗口标题H…...

数据分析:R语言计算XGBoost线性回归模型的SHAP值
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍SHAP用途计算方法:应用加载R包导入数据数据预处理函数模型介绍 SHAP(SHapley Additive exPlanations)值是一种解释机器学习模型预测的方法。它基于博弈论中的Shapley值概念,…...

SprinBoot+Vue图书馆预约与占座微信小程序的设计与实现
目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue3.6 uniapp代码 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍:CSDN认证博客专家,CSDN平…...

云计算之大数据(上)
目录 一、Elasticsearch 1.1 产品组件 1.1.1 X-Pack 1.1.2 Beats数据采集中心 1.1.3 Logstash 1.1.4 Kibana 1.2 架构特性 1.2.1 性能 1.2.2 安全性 1.2.3 可用性 1.2.4 可扩展性 1.2.5 可维护性 1.2.6 国际化 1.3 综合检索分析 1.4 全观测 1.5 大数据检索加速…...

交友系统“陌陌”全方位解析
交友系统在现代社会中扮演着越来越重要的角色,尤其是随着互联网技术的发展,各种交友软件层出不穷。陌陌作为其中的佼佼者,其全方位解析对于理解交友系统的商业开发至关重要。 陌陌的核心功能是提供基于地理位置的社交服务,用户可…...
Android 删除开机动画
Android 删除开机动画 两种方法都是将debug.sf.nobootanimation的值改为属性1 第一种: frameworks/base/cmds/bootanimation/BootAnimationUtil.cpp bool bootAnimationDisabled() {char value[PROPERTY_VALUE_MAX]; // property_get("debug.sf.nobootani…...

我用 GPT 学占星
最近对占星赶兴趣,但是看到星盘中好多名词,不懂是什么意思?所以直接问 gpt , 发现回答的真的很棒🎉 ! 假如我想知道各个状态的具体是根据什么数据来显示的? 分分钟解决了我的问题; 我…...

028、架构_高可用_主从原理
MySQL半同步复制概览 MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致。主从复制的基本过程如下图所示: 主从复制的完成通过以下三个进程实现的主库 binary log dump 线程:当从库连接主库时,…...

【启明智显技术分享】探讨CAN总线相关知识以及Model3C 2路CAN的应用
一、 CAN总线相关知识 CAN总线概述 CAN(Controller Area Network)总线是一种高实时性、高可靠性和灵活性的串行通信协议,广泛应用于汽车和工业控制系统中。它由德国BOSCH公司开发,最高速率可达到1Mbps,具有强大的检错…...
【python学习】深度解析 Python 的 .env配置与最佳实践:温格高的环境变量配置之道
1. 文章简介 在开发和部署 Python 项目时,环境变量配置对于管理敏感信息如数据库连接字符串、API 密钥至关重要。本文将以温格高(2023年环法冠军)的项目为例,详细介绍如何通过 .env 文件简化环境配置,并分享多环境管理、Docker 集成等热门功能。我们还将覆盖一些小技巧和…...

大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

android RelativeLayout布局
<?xml version"1.0" encoding"utf-8"?> <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent"android:layout_height"match_parent"android:gravity&…...

AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...

Mac flutter环境搭建
一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...

【Qt】控件 QWidget
控件 QWidget 一. 控件概述二. QWidget 的核心属性可用状态:enabled几何:geometrywindows frame 窗口框架的影响 窗口标题:windowTitle窗口图标:windowIconqrc 机制 窗口不透明度:windowOpacity光标:cursor…...