逻辑回归是一种监督学习分类算法,它通过将线性回归模型的输出压缩到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