目录
引用:
逻辑回归是一种用于分类问题的统计方法,尽管其名称中带有“回归”,但它主要用于解决二分类问题。其基本思想是通过一个线性模型来估计某事件发生的概率,概率值通过逻辑函数(也称为sigmoid函数)来转换。下面阐述一下逻辑回归的基本数学原理,并举出一个基本示例(Kaggle上面的公开数据集)来说明逻辑回归。
数学原理:
1:线性组合
我们将所有的特征进行线性组合。假设我们有三个特征 x1,x2 和 x3(可以是年龄、性别等),我们用以下公式进行线性组合:
其中,w1,w2,w3是权重,b是偏置项,z 是线性组合的结果。
2:Sigmoid函数
为了将线性组合的结果 z 转换为概率,我们使用了一个叫做Sigmoid函数的函数。Sigmoid函数可以将任何实数转换为0到1之间的概率:
这里,e是自然对数的底,大约等于2.71828。通过这个函数,我们将线性组合的结果 z 转换为一个概率 P(y=1∣x),即乘客生存的概率。
3:预测类别与损失函数
有了概率后,我们可以根据概率来预测类别。如果概率大于0.5,我们预测乘客会幸存(类别为1);如果概率小于等于0.5,我们预测乘客不会幸存(类别为0)。为了找到最佳的权重和偏置项,使我们的预测尽可能准确,我们需要一个优化目标。我们使用对数似然函数作为损失函数来衡量模型的好坏:
其中,m 是样本数,yi是第 i个样本的真实标签,P(yi∣xi) 是模型预测的第 i个样本为正类(生存)的概率。
4:梯度下降来优化损失函数
为了优化损失函数,找到最优的权重和偏置项,我们使用梯度下降法。梯度下降法通过不断调整权重和偏置项,使损失函数逐步减小。其更新规则为:
其中,α是学习率,决定了每一步调整的幅度。
项目实列之预测泰坦尼克号上乘客的生存情况
1:数据准备
数据来源于Titanic - Machine Learning from Disaster | Kaggle,上面可以直接进行下载,如果以前没用过的话直接注册一个就可以了。里面有三个数据分别是训练集和测试集,以及幸存人数。训练集的数据如下所示(部分):
2:代码:
import pandas as pd#导入pandas用于读取数据
from matplotlib import pyplot as plt#用于绘制图像的库
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, confusion_matrix, classification_report
# 1. 加载数据
train_data = pd.read_csv(r'C:\Users\35173\Desktop\train.csv')
test_data = pd.read_csv(r'C:\Users\35173\Desktop\test.csv')
# 2. 数据预处理
# 合并训练集和测试集以统一处理
data = pd.concat([train_data, test_data], sort=False)
# 删除不必要的列,如 'Name', 'Ticket', 'Cabin'
data = data.drop(['Name', 'Ticket', 'Cabin'], axis=1)
# 填补缺失值
data['Age'].fillna(data['Age'].mean(), inplace=True)
data['Embarked'].fillna(data['Embarked'].mode()[0], inplace=True)
data['Fare'].fillna(data['Fare'].mean(), inplace=True)
# 将类别特征转换为数值特征
data = pd.get_dummies(data, columns=['Sex', 'Embarked'], drop_first=True)
# 将数据分割回训练集和测试集
train_data = data[data['Survived'].notna()]
test_data = data[data['Survived'].isna()].drop(['Survived'], axis=1)
# 3. 特征选择与标签分离
X = train_data.drop('Survived', axis=1)
y = train_data['Survived']
# 4. 数据分割
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# 5. 特征缩放
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_val = scaler.transform(X_val)
test_data = scaler.transform(test_data)
# 6. 模型训练
model = LogisticRegression(max_iter=1000)
model.fit(X_train, y_train)
# 7. 预测与评估
y_val_pred = model.predict(X_val)
plt.rcParams['font.sans-serif'] = ['SimHei'] # 指定中文字体为宋体
plt.rcParams['axes.unicode_minus'] = False
print("验证精度:", accuracy_score(y_val, y_val_pred))
print("混淆矩阵:\n", confusion_matrix(y_val, y_val_pred))
print("分类报告:\n", classification_report(y_val, y_val_pred))
# 8. 预测测试集
y_test_pred = model.predict(test_data)
3:结果:
4:解释
验证精度是指模型在验证集上预测的准确度。它表示模型预测正确的样本数占总样本数的比例。混淆矩阵是一种可视化工具,用于总结分类模型的性能。它展示了实际标签和预测标签的对比情况。分类报告提供了更详细的分类性能指标,包括精确率、召回率和F1分数。(其中精确率表示在所有被预测为正类的样本中,实际为正类的比例。而召回率表示在所有实际为正类的样本中,被正确预测为正类的比例。F1分数是精确率和召回率的调和平均值,用于综合评估模型性能。)
结语:
在kaggle上这是一个有意思的比赛,有很多人将他的分类结果保存并上传感兴趣你也试一下吧。