逻辑回归模型详解

逻辑回归是一种监督学习分类算法,它通过将线性回归模型的输出压缩到0到1的范围内,可以被解释为概率。这种模型能够为二元分类任务提供类别标签的概率,因此被称为逻辑回归分类器。

逻辑回归中,使用Sigmoid函数(也称为Logistic函数)来预测二元结果发生的可能性。Sigmoid函数是一种激活函数,用于在机器学习模型中引入非线性。它接受一个值并将其转换为0和1之间的值。

逻辑回归通过识别独立特征变量之间的联系来预测类别标签。决策边界是线性的,用于分类目的。逻辑回归模型易于实现,训练效率高,不易过拟合,并且在线性可分的数据集上表现良好。然而,它只能预测离散函数,并且不能解决非线性问题。

逻辑回归的应用场景包括但不限于:判断电子邮件是否为垃圾邮件、评估水质是否良好等。

本文所使用的数据集是Kaggle上的“葡萄酒质量二元分类数据集”,包含影响红葡萄酒质量的各种因素的信息。数据集包含1600个实例,没有缺失值,共有12个属性,其中输入变量为数值类型,输出变量用于检测质量好坏(0-差,1-好)。

Python中,可以使用pandas库加载数据集,并进行数据预处理,例如将质量列映射为0表示差,1表示好。检查缺失值后,可以使用seaborn库绘制统计图和分布图,以直观地了解数据。

import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns import warnings warnings.filterwarnings('ignore') # 加载数据集 df=pd.read_csv("wine.csv") df.head() # 数据预处理 df = df.replace({'quality': {'good': 1, 'bad': 0}}) df.head() # 检查缺失值 df.isna().any().any()

接下来,可以使用ExtraTreesClassifier来计算特征的重要性得分,并定义特征和目标变量。特征包括酒精、硫酸盐、总硫、挥发酸、柠檬酸和残糖。目标变量是质量。

from sklearn.ensemble import ExtraTreesClassifier model = ExtraTreesClassifier() model.fit(features, target) print(model.feature_importances_) imp = pd.Series(model.feature_importances_, index=features.columns) imp.nlargest(10).plot(kind='barh') plt.show() from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression # 标准化特征向量 sc=StandardScaler() scaled_features=sc.fit_transform(features) # 逻辑回归模型 X_train, X_test, y_train, y_test = train_test_split(scaled_features, target, test_size=0.3, random_state=42) lr=LogisticRegression() lr.fit(X_train,y_train) print(classification_report(y_test,lr.predict(X_test))) from sklearn.datasets.samples_generator import make_blobs X, Y = make_blobs(n_samples=100, centers=2, n_features=2, cluster_std=5, random_state=11) def sigmoid(z): return 1 / (1 + np.exp(-z)) def hy(w,X): z = np.array(w[0] + w[1]*np.array(X[:,0]) + w[2]*np.array(X[:,1])) return sigmoid(z) def cost(w, X, Y): y_predictions = hy(w,X) return -1 * sum(Y*np.log(y_predictions) + (1-Y)*np.log(1-y_predictions)) def partial_derivatives(w, X, Y): y_predictions = hy(w,X) j = [0]*3 j[0] = -1 * sum(Y*(1-y_predictions) - (1-Y)*y_predictions) j[1] = -1 * sum(Y*(1-y_predictions)*X[:,0] - (1-Y)*y_predictions*X[:,0]) j[2] = -1 * sum(Y*(1-y_predictions)*X[:,1] - (1-Y)*y_predictions*X[:,1]) return j def gradient_descent(w_new, w_prev, learning_rate): while True: w_prev = w_new w0 = w_prev[0] - learning_rate*partial_derivatives(w_prev, X, Y)[0] w1 = w_prev[1] - learning_rate*partial_derivatives(w_prev, X, Y)[1] w2 = w_prev[2] - learning_rate*partial_derivatives(w_prev, X, Y)[2] w_new = [w0, w1, w2] if (w_new[0]-w_prev[0])**2 + (w_new[1]-w_prev[1])**2 + (w_new[2]-w_prev[2])**2 < 100: return w_new
沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485