加载鸢尾花数据集,鸢尾花一共三种,请将其编码为{0,1,2},请将 feature 进行标准化,在二分类问题上,使用属性:花萼长度、花萼宽度,拟合模型并画出决策区域,在多分类问题上,拟合模型并画出决策区域,请解释每一条语句中各参数的含义,探索不同的正则化方法、和不同的 C 值对权重的影响,并解释结果图
时间: 2023-06-12 08:05:08 浏览: 68
下面是加载鸢尾花数据集并进行编码:
```python
from sklearn.datasets import load_iris
from sklearn.preprocessing import LabelEncoder
iris = load_iris()
X, y = iris.data[:, :2], iris.target
# 将 y 进行编码为 {0, 1, 2}
encoder = LabelEncoder()
y = encoder.fit_transform(y)
```
其中 `load_iris()` 函数是从 sklearn.datasets 中加载鸢尾花数据集,`X` 表示所有样本的 feature,`y` 表示所有样本的 label。`LabelEncoder()` 是一个用于标签编码的类,将标签转换为从 0 开始的数字。
接下来对 feature 进行标准化:
```python
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)
```
`StandardScaler()` 类是用于标准化 feature 的,将 feature 缩放为均值为 0,方差为 1 的分布。该类的 `fit_transform()` 方法用于计算均值和方差并缩放数据。
在二分类问题上,我们选择属性:花萼长度、花萼宽度,拟合模型并画出决策区域:
```python
from sklearn.linear_model import LogisticRegression
import matplotlib.pyplot as plt
import numpy as np
# 只选择花萼长度和花萼宽度两个 feature
X_binary = X[:, :2]
# 构造模型
clf_binary = LogisticRegression()
clf_binary.fit(X_binary, y)
# 画出决策区域
x_min, x_max = X_binary[:, 0].min() - .5, X_binary[:, 0].max() + .5
y_min, y_max = X_binary[:, 1].min() - .5, X_binary[:, 1].max() + .5
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = clf_binary.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4, 3))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
# 画出训练数据
plt.scatter(X_binary[:, 0], X_binary[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.show()
```
其中,`LogisticRegression()` 是逻辑回归模型,`fit()` 方法用于拟合模型,`predict()` 方法用于预测数据。`np.meshgrid()` 函数用于生成网格点坐标,`np.c_[]` 函数用于将两个数组按列连接,`reshape()` 方法用于重塑数组形状。
在多分类问题上,我们仍然选择所有 feature,拟合模型并画出决策区域:
```python
from sklearn.linear_model import LogisticRegression
# 构造模型
clf_multi = LogisticRegression(multi_class='multinomial', solver='lbfgs')
clf_multi.fit(X, y)
# 画出决策区域
x_min, x_max = X[:, 0].min() - .5, X[:, 0].max() + .5
y_min, y_max = X[:, 1].min() - .5, X[:, 1].max() + .5
xx, yy = np.meshgrid(np.linspace(x_min, x_max, 100), np.linspace(y_min, y_max, 100))
Z = clf_multi.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.figure(1, figsize=(4, 3))
plt.pcolormesh(xx, yy, Z, cmap=plt.cm.Paired)
# 画出训练数据
plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Paired)
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.xticks(())
plt.yticks(())
plt.show()
```
`multi_class` 指定了多分类的方式,`solver` 指定了求解方法。
对于正则化方法和 C 值的影响,我们可以使用不同的参数进行实验,观察权重的变化和结果图的变化。L1 正则化可以使得一些权重为 0,L2 正则化可以使得权重逐渐趋近于 0。C 值越大,正则化的程度越小,模型更倾向于过拟合。
总之,通过上述步骤,我们可以加载鸢尾花数据集,将其编码为{0,1,2},对 feature 进行标准化,在二分类问题和多分类问题上拟合模型并画出决策区域,探索不同的正则化方法和 C 值对权重的影响。
阅读全文