代码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 平滑概率 叶子节点类别频率,不连续
过拟合 较不容易,配合正则化 容易过拟合,需要剪枝/限制深度
外推能力 可以外推 不能外推,只会在训练范围附近划分
适用场景 线性可分、需要概率和解释 非线性、规则复杂、混合类型特征
一句话总结:
逻辑回归是"画一条线"来分类,决策树是"不断切蛋糕"来分类。前者简单稳定、可解释为权重;后者灵活强大、可解释为规则,但更容易过拟合。
文章仅供参考用。