二分类问题中,如何计算观察改了
时间: 2024-05-21 12:14:11 浏览: 28
分类的准确性?
在二分类问题中,可以计算出四种不同的情况,包括真正例(TP)、假正例(FP)、真反例(TN)和假反例(FN)。其中,真正例指的是分类器将正样本正确地分类为正类;假正例指的是分类器将负样本错误地分类为正类;真反例指的是分类器将负样本正确地分类为负类;假反例指的是分类器将正样本错误地分类为负类。
准确率(Accuracy)= (TP + TN) / (TP + FP + TN + FN)
在二分类问题中,准确率是指分类器正确地分类样本的比例,即真正例和真反例的比例。
如果需要更加关注某一类样本的分类效果,还可以计算出精准率、召回率和 F1 值。
精准率(Precision)= TP / (TP + FP)
在二分类问题中,精准率是指分类器预测为正例的样本中实际为正例的比例,衡量了分类器将负样本误判为正样本的能力。
召回率(Recall)= TP / (TP + FN)
在二分类问题中,召回率是指实际为正例的样本中分类器预测为正例的比例,衡量了分类器正确分类正样本的能力。
F1 值(F1-Score)= 2 * Precision * Recall / (Precision + Recall)
F1 值综合考虑了精准率和召回率,在不同精准率和召回率之间取得平衡,是一个相对较为全面的评估指标。
相关问题
题目三:采用 scikit-learn 中的 LogisticRegression 逻辑回归模型对非线性数据集进行分类。 具体内容: (1)数据集:使用 sklearn 自带数据生成器 make_moons 产生两类数据样本,示例程序如下, 参数可自行修改。 (2)特征衍生(数据增强):使用 sklearn 自带 sklearn.preprocessing.PolynomialFeatures 生成指 定阶次的多项式特征,从而得到所有多项式组合成的新特征矩阵,degree 参数任选。(3)模型建立:在新特征基础上建立逻辑回归二分类模型。 (4)决策边界可视化:绘制决策边界,观察非线性边界的变化。 【讨论二】在不加正则项的情况下,改变特征衍生的特征数量(即 degree 参数),观察决策边 界的变化情况,以及训练集和测试集分数,体会模型从欠拟合 ->拟合 ->过拟合的过程。 提示:可使用 for 循环对不同 degree 进行遍历,观察模型的建模结果。
好的,下面是代码实现:
```
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.model_selection import train_test_split
# 生成数据集
X, y = make_moons(n_samples=200, noise=0.1, random_state=1)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
# 不同阶次的多项式特征
degrees = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 绘制决策边界
plt.figure(figsize=(20, 10))
for i, degree in enumerate(degrees):
# 创建管道模型
polynomial_logistic_regression = Pipeline([
("poly_features", PolynomialFeatures(degree=degree)),
("logistic_regression", LogisticRegression(random_state=1))
])
# 模型训练
polynomial_logistic_regression.fit(X_train, y_train)
# 绘制决策边界
plt.subplot(2, 5, i+1)
plt.title("Degree {}".format(degree))
plt.scatter(X[:, 0], X[:, 1], c=y, cmap="coolwarm", edgecolors="k")
xx, yy = np.meshgrid(np.linspace(-2, 3, 500), np.linspace(-1.5, 2, 500))
Z = polynomial_logistic_regression.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
plt.contourf(xx, yy, Z, cmap="coolwarm", alpha=0.2)
plt.xlim(-2, 3)
plt.ylim(-1.5, 2)
plt.xticks(())
plt.yticks(())
# 输出模型在训练集和测试集上的得分
print("Degree {}: train score: {:.3f}, test score: {:.3f}"
.format(degree, polynomial_logistic_regression.score(X_train, y_train),
polynomial_logistic_regression.score(X_test, y_test)))
plt.show()
```
这段代码实现了对非线性数据集进行分类,使用了逻辑回归模型,并且通过特征衍生(即数据增强)使用 sklearn.preprocessing.PolynomialFeatures 生成指定阶次的多项式特征,建立了在新特征基础上的逻辑回归二分类模型,并绘制了决策边界,观察非线性边界的变化。同时,在不加正则项的情况下,通过改变特征衍生的特征数量(即 degree 参数),观察决策边界的变化情况,以及训练集和测试集分数,体会模型从欠拟合 ->拟合 ->过拟合的过程。
加载鸢尾花数据集,鸢尾花一共三种,请将其编码为{0,1,2},请将 feature 进行标准化,在二分类问题上,拟合模型并画出决策区域,在多分类问题上,拟合模型并画出决策区域,请解释每一条语句中各参数的含义,探索不同的正则化方法、和不同的 C 值对权重的影响,并解释结果图
首先,我们需要导入所需要的库,并加载鸢尾花数据集:
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
from mlxtend.plotting import plot_decision_regions
# Load iris dataset
iris = load_iris()
X = iris.data
y = iris.target
```
接着,我们将鸢尾花的三个类别分别编码为{0,1,2}:
```python
# Encode labels
y[y == 0] = 0
y[y == 1] = 1
y[y == 2] = 2
```
然后,我们将 feature 进行标准化:
```python
# Standardize features
scaler = StandardScaler()
X = scaler.fit_transform(X)
```
在二分类问题上,我们选择 sepal length 和 petal length 作为 feature,将其分别作为 X 和 y,然后进行拟合模型并画出决策区域:
```python
# Binary classification
X_bin = X[:, [0, 2]]
y_bin = y.copy()
y_bin[y_bin == 2] = 1
# Split dataset
X_train, X_test, y_train, y_test = train_test_split(X_bin, y_bin, test_size=0.3, random_state=42)
# Fit model
clf_bin = LogisticRegression(C=1.0, penalty='l2', solver='liblinear')
clf_bin.fit(X_train, y_train)
# Predict
y_pred_bin = clf_bin.predict(X_test)
print('Binary Classification Accuracy:', accuracy_score(y_test, y_pred_bin))
# Plot decision regions
plot_decision_regions(X=X_bin, y=y_bin, clf=clf_bin, legend=2)
plt.xlabel('Sepal length (standardized)')
plt.ylabel('Petal length (standardized)')
plt.title('Logistic Regression - Decision Region (Binary Classification)')
plt.show()
```
在多分类问题上,我们选择 sepal length 和 petal length 作为 feature,将其作为 X,然后进行拟合模型并画出决策区域:
```python
# Multi-class classification
X_multi = X[:, [0, 2]]
# Split dataset
X_train, X_test, y_train, y_test = train_test_split(X_multi, y, test_size=0.3, random_state=42)
# Fit model
clf_multi = LogisticRegression(C=1.0, penalty='l2', solver='lbfgs', multi_class='auto')
clf_multi.fit(X_train, y_train)
# Predict
y_pred_multi = clf_multi.predict(X_test)
print('Multi-Class Classification Accuracy:', accuracy_score(y_test, y_pred_multi))
# Plot decision regions
plot_decision_regions(X=X_multi, y=y, clf=clf_multi, legend=3)
plt.xlabel('Sepal length (standardized)')
plt.ylabel('Petal length (standardized)')
plt.title('Logistic Regression - Decision Region (Multi-Class Classification)')
plt.show()
```
其中,各参数的含义如下:
- `X`:feature 矩阵
- `y`:label 数组
- `StandardScaler`:将 feature 进行标准化的类
- `LogisticRegression`:逻辑回归模型类
- `train_test_split`:将数据集分为训练集和测试集的函数
- `accuracy_score`:计算分类准确率的函数
- `plot_decision_regions`:画出决策区域的函数
- `C`:正则化系数
- `penalty`:正则化方法,包括 L1 和 L2 正则化
- `solver`:求解算法,包括 liblinear 和 lbfgs
- `multi_class`:多分类问题的处理方式,包括 one-vs-rest 和 multinomial
在正则化和 C 值的影响上,我们可以通过改变这些参数来观察权重的变化和结果图的变化。例如,我们可以将正则化方法改为 L1 正则化,C 值改为 0.1,可以得到以下结果:
```python
# Fit model
clf_multi = LogisticRegression(C=0.1, penalty='l1', solver='saga', multi_class='auto')
clf_multi.fit(X_train, y_train)
# Predict
y_pred_multi = clf_multi.predict(X_test)
print('Multi-Class Classification Accuracy:', accuracy_score(y_test, y_pred_multi))
# Plot decision regions
plot_decision_regions(X=X_multi, y=y, clf=clf_multi, legend=3)
plt.xlabel('Sepal length (standardized)')
plt.ylabel('Petal length (standardized)')
plt.title('Logistic Regression - Decision Region (Multi-Class Classification)')
plt.show()
# Print weights
print('Weights:', clf_multi.coef_)
```
可以看到,L1 正则化可以使得权重更加稀疏,而 C 值的变化则会影响权重的大小。在结果图上,我们可以看到决策区域的边界变得更加明显,不同类别之间的区域也更加清晰。
阅读全文