好的,我明白了。针对您的问题,我们可以按照以下步骤进行操作:
1. 导入所需的库
我们需要导入 scikit-learn 中的 LogisticRegression 模型和 iris 数据集,以及 matplotlib 库用于可视化。
```python
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt
```
2. 加载数据集
我们将使用 scikit-learn 中自带的 iris 数据集,其中包含 150 个样本,每个样本包含 4 个特征和一个类别标签。我们将使用 load_iris() 函数加载数据集,并将其划分为训练集和测试集。
```python
iris = load_iris()
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.3, random_state=42)
```
3. 定义模型
我们将使用 scikit-learn 中的 LogisticRegression 模型,并将其应用于三种不同的多分类策略:
- "ovr" (one-vs-rest) 策略:将每个类别与其他类别分开,形成三个二分类问题。
- "multinomial" 策略:使用 Softmax 函数对所有类别进行建模,形成一个多分类问题。
- "auto" 策略:根据数据类型和 solver 参数自动选择 "ovr" 或 "multinomial" 策略。
```python
ovr_model = LogisticRegression(multi_class='ovr', solver='liblinear')
multinomial_model = LogisticRegression(multi_class='multinomial', solver='lbfgs')
auto_model = LogisticRegression(multi_class='auto', solver='lbfgs')
```
4. 训练模型并进行预测
我们将使用训练集对三个模型进行训练,并使用测试集进行预测。我们还将计算每个模型的测试准确率。
```python
ovr_model.fit(X_train, y_train)
ovr_pred = ovr_model.predict(X_test)
ovr_acc = accuracy_score(y_test, ovr_pred)
multinomial_model.fit(X_train, y_train)
multinomial_pred = multinomial_model.predict(X_test)
multinomial_acc = accuracy_score(y_test, multinomial_pred)
auto_model.fit(X_train, y_train)
auto_pred = auto_model.predict(X_test)
auto_acc = accuracy_score(y_test, auto_pred)
```
5. 可视化边界
我们可以使用 matplotlib 库可视化模型的边界。由于 iris 数据集包含 4 个特征,我们只能可视化其中两个特征。我们将使用第 1 个和第 2 个特征,并绘制训练集和测试集上的决策边界。
```python
def plot_boundary(model, X, y):
x_min, x_max = X[:, 0].min() - 0.1, X[:, 0].max() + 0.1
y_min, y_max = X[:, 1].min() - 0.1, X[:, 1].max() + 0.1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape)
plt.contourf(xx, yy, Z, alpha=0.3)
plt.scatter(X[:, 0], X[:, 1], c=y, alpha=0.8)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.title('Decision boundary')
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plot_boundary(ovr_model, X_train[:, :2], y_train)
plt.title('One-vs-Rest (train acc: {:.2f})'.format(ovr_acc))
plt.subplot(1, 3, 2)
plot_boundary(multinomial_model, X_train[:, :2], y_train)
plt.title('Multinomial (train acc: {:.2f})'.format(multinomial_acc))
plt.subplot(1, 3, 3)
plot_boundary(auto_model, X_train[:, :2], y_train)
plt.title('Auto (train acc: {:.2f})'.format(auto_acc))
plt.tight_layout()
plt.show()
```
6. 结果对比
我们可以将三个模型的测试准确率和决策边界可视化结果进行对比。
```python
print('One-vs-Rest test accuracy: {:.2f}'.format(ovr_acc))
print('Multinomial test accuracy: {:.2f}'.format(multinomial_acc))
print('Auto test accuracy: {:.2f}'.format(auto_acc))
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1)
plot_boundary(ovr_model, X_test[:, :2], y_test)
plt.title('One-vs-Rest (test acc: {:.2f})'.format(ovr_acc))
plt.subplot(1, 3, 2)
plot_boundary(multinomial_model, X_test[:, :2], y_test)
plt.title('Multinomial (test acc: {:.2f})'.format(multinomial_acc))
plt.subplot(1, 3, 3)
plot_boundary(auto_model, X_test[:, :2], y_test)
plt.title('Auto (test acc: {:.2f})'.format(auto_acc))
plt.tight_layout()
plt.show()
```
运行以上代码,即可得到对应的结果。