Python体现逻辑回归和决策树的区别

代码1:逻辑回归

```python

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets import make_moons

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LogisticRegression

from sklearn.metrics import accuracy_score

1. 生成非线性数据:两个交错半圆

X, y = make_moons(n_samples=300, noise=0.25, random_state=42)

X_train, X_test, y_train, y_test = train_test_split(

X, y, test_size=0.3, random_state=42

)

2. 训练逻辑回归

clf = LogisticRegression()

clf.fit(X_train, y_train)

3. 预测与评估

y_pred = clf.predict(X_test)

print("逻辑回归准确率:", accuracy_score(y_test, y_pred))

print("逻辑回归系数:", clf.coef_)

print("逻辑回归截距:", clf.intercept_)

4. 绘制决策边界

xx, yy = np.meshgrid(

np.linspace(X:, 0.min() - 0.5, X:, 0.max() + 0.5, 500),

np.linspace(X:, 1.min() - 0.5, X:, 1.max() + 0.5, 500)

)

Z = clf.predict(np.c_xx.ravel(), yy.ravel()).reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')

plt.scatter(X_train:, 0, X_train:, 1, c=y_train,

edgecolor='k', cmap='coolwarm', label='train')

plt.scatter(X_test:, 0, X_test:, 1, c=y_test,

marker='x', cmap='coolwarm', label='test')

plt.title("逻辑回归:线性决策边界")

plt.legend()

plt.show()

```

特点:

逻辑回归的决策边界是一条直线,因为它的本质是线性分类器。它在这个非线性数据上通常表现一般。


代码2:决策树

```python

import numpy as np

import matplotlib.pyplot as plt

from sklearn.datasets import make_moons

from sklearn.model_selection import train_test_split

from sklearn.tree import DecisionTreeClassifier, export_text

from sklearn.metrics import accuracy_score

1. 同一份数据

X, y = make_moons(n_samples=300, noise=0.25, random_state=42)

X_train, X_test, y_train, y_test = train_test_split(

X, y, test_size=0.3, random_state=42

)

2. 训练决策树

clf = DecisionTreeClassifier(max_depth=4, random_state=42)

clf.fit(X_train, y_train)

3. 预测与评估

y_pred = clf.predict(X_test)

print("决策树准确率:", accuracy_score(y_test, y_pred))

print("特征重要性:", clf.feature_importances_)

4. 打印树规则,展示可解释性

print("\n决策树规则示例:")

print(export_text(clf, feature_names='x1', 'x2'))

5. 绘制决策边界

xx, yy = np.meshgrid(

np.linspace(X:, 0.min() - 0.5, X:, 0.max() + 0.5, 500),

np.linspace(X:, 1.min() - 0.5, X:, 1.max() + 0.5, 500)

)

Z = clf.predict(np.c_xx.ravel(), yy.ravel()).reshape(xx.shape)

plt.contourf(xx, yy, Z, alpha=0.3, cmap='coolwarm')

plt.scatter(X_train:, 0, X_train:, 1, c=y_train,

edgecolor='k', cmap='coolwarm', label='train')

plt.scatter(X_test:, 0, X_test:, 1, c=y_test,

marker='x', cmap='coolwarm', label='test')

plt.title("决策树:非线性、阶梯状决策边界")

plt.legend()

plt.show()

```

特点:

决策树可以拟合非线性边界,决策边界是"阶梯状"的。它不需要特征缩放,但树太深容易过拟合。


两者核心区别

对比项 逻辑回归 决策树

模型类型 线性模型 非线性模型

决策边界 直线 / 超平面 轴对齐的阶梯状边界

可解释性 系数表示特征对对数几率的影响 if-else 规则,直观但树深后复杂

特征缩放 通常需要 不需要

概率输出 Sigmoid 平滑概率 叶子节点类别频率,不连续

过拟合 较不容易,配合正则化 容易过拟合,需要剪枝/限制深度

外推能力 可以外推 不能外推,只会在训练范围附近划分

适用场景 线性可分、需要概率和解释 非线性、规则复杂、混合类型特征

一句话总结:

逻辑回归是"画一条线"来分类,决策树是"不断切蛋糕"来分类。前者简单稳定、可解释为权重;后者灵活强大、可解释为规则,但更容易过拟合。

文章仅供参考用。

相关推荐
LOVE️YOU37 分钟前
Python 类与对象的核心逻辑:从 self、cls 到点号、括号与链式调用
开发语言·python
顶点多余43 分钟前
C/C++常见面试题
开发语言·c++
HugoStudio_SWAN1 小时前
洛谷 B4575 [GESP202609 二级] 直角三角形——临场定义理解与边界质疑
c++·学习·程序人生·算法
(Charon)1 小时前
【C++面试】右值引用与移动语义:std::move到底做了什么
开发语言·c++
TheITSea1 小时前
JavaScript Web APIs
开发语言·前端·javascript
空心木偶☜1 小时前
A2A2A(多智能体协作)
开发语言·python·ai·ai编程
红豆诗人1 小时前
C++二叉搜索树:查找、插入和删除为什么这样写
数据结构·c++·算法
HZjiangzi1 小时前
深耕精密驱动二十六载,捷昌驱动助力机器人产业升级发展
人工智能·算法
奋发向前wcx1 小时前
CSP-J复赛模拟赛3 王晨旭补题 2026.10.4
算法