【机器学习算法】——逻辑回归

逻辑回归原理

  • 逻辑回归是用来二分类的!

  • 是在线性回归模型之后加了一个激活函数(Sigmoid)将预测值归一化到【0~1】之间,变成概率值。

  • 因此:逻辑回归=线性回归模型+sigmoid激活函数
    在这里插入图片描述

  • 对于二分类任务来说,一般计算其中一个类别的概率P,自然会得到另一个类别的概率1-P。

  • 假如一个人是女生的概率是0.7,是男生的概率是多少呢?

    • 自然是0.3。
    • 那你会认为这个人是男生还是女生呢?
    • 当时是女生!
  • 一般认为概率最大的类别为分类结果。

损失函数

  • MSE loss:计算数值之间的差异 (线性回归)
  • BCE Loss:计算分布之间的差异(逻辑回归)
    在这里插入图片描述
    在这里插入图片描述

代码实现

# 导入必要的库
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
import matplotlib.pyplot as plt

# 准备数据
x_data = [1.0], [2.0], [3.0]
y_data = [0], [0], [1]

# 创建并拟合逻辑回归模型
model = LogisticRegression()
model.fit(x_data, y_data )

# 在测试集上进行预测
y_pred = model.predict(x_data)# predict预测的是值,可能是:[0,0,1]

# 计算准确率
accuracy = accuracy_score(y_data, y_pred)
print("Accuracy:", accuracy)


# 绘制决策边界
x = np.linspace(0, 10, 200).reshape(-1,1)#变成200行,1列
y = model.predict_proba(x)[:, 1]#predict_proba预测的是类别为1的概率值,取值范围为:[0,1]概率值[0.2,0.3,0.8]

plt.plot(x, y)
plt.plot([0, 10], [0.5, 0.5], c='r')#在概率=0.5时画一条红色直线;概率<0.5认为类别为0;概率>=0.5认为类别为1.
plt.xlabel('Hours')
plt.ylabel('Probability of Pass')
plt.grid()
plt.show()

在这里插入图片描述

练习

1. 波士顿房价预测

在这里插入图片描述

import pandas as pd
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import matplotlib
from sklearn.metrics import mean_squared_error

# 设置图片清晰度
plt.rcParams['figure.dpi'] = 300
matplotlib.rcParams['font.family'] = 'sans-serif'
matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 使用黑体

# 1.加载数据集
df = pd.read_csv('housing.csv', sep="\s+", header=None)

# 2.划分特征变量X和目标变量y
X = df.iloc[:, :-1].values  # 选择所有特征列
y = df.iloc[:, -1].values    # 选择目标列

# 3.手动划分训练集和测试集
train_size = int(len(df) * 0.8)
X_train = X[:train_size]
y_train = y[:train_size]
X_test = X[train_size:]
y_test = y[train_size:]

# 4.构建线性回归模型并训练
model = LinearRegression()
model.fit(X_train, y_train)

# 5.进行预测(测试集)
y_pred = model.predict(X_test)

# 6.计算mse loss
mse = mean_squared_error(y_test, y_pred)
print(f'Mean Squared Error: {mse:.2f}')

# 7.绘制实际房价和预测房价的散点图
plt.figure(figsize=(10, 6))
plt.scatter(y_test, y_pred, alpha=0.5)
# 绘制对角线
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], color='red')
#对角线表示理想预测:这一条线能帮助直观地判断模型效果。
#点的分布:如果大部分点靠近这条线,说明预测效果较好;如果远离,则可能意味着需要对模型进行调整或改进。
plt.xlabel('实际房价(千美元)')
plt.ylabel('预测房价(千美元)')
plt.title('实际房价与预测房价的关系')
plt.grid()
plt.show()

2.基于学生特征的录取概率预测

在这里插入图片描述

import pandas as pd
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, log_loss
from sklearn.preprocessing import LabelEncoder

# 1.加载训练集和测试集
train_data = pd.read_csv('data/train.csv')
test_data = pd.read_csv('data/test.csv')

# 2.数据预处理
# 填充训练集和测试集的 Age 列缺失值为均值
train_data['Age'] = train_data['Age'].fillna(train_data['Age'].mean())
test_data['Age'] = test_data['Age'].fillna(test_data['Age'].mean())

# 填充测试集的 Fare 列缺失值为均值
test_data['Fare'] = test_data['Fare'].fillna(test_data['Fare'].mean())

# 填充训练集的 Embarked 列缺失值为众数
train_data['Embarked'] = train_data['Embarked'].fillna(train_data['Embarked'].mode()[0])

# 对 Sex 和 Embarked 列进行编码,进行编码是为了将分类变量转换为数值格式,以便可以被机器学习模型使用
label_encoder = LabelEncoder()
train_data['Sex'] = label_encoder.fit_transform(train_data['Sex'])
test_data['Sex'] = label_encoder.transform(test_data['Sex'])

train_data['Embarked'] = label_encoder.fit_transform(train_data['Embarked'])
test_data['Embarked'] = label_encoder.transform(test_data['Embarked'])

# 3.选择特征X_train、X_test 和目标变量y_train
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
X_train = train_data[features]
y_train = train_data['Survived']

X_test = test_data[features]

# 4.构建逻辑回归模型
model = LogisticRegression(max_iter=1000)#max_iter 的默认值通常是 100,用于指定优化算法的最大迭代次数。如果你发现模型没有收敛或性能较差,可以尝试增加此参数。
model.fit(X_train, y_train)

# 5. 在测试集上进行预测
y_pred = model.predict(X_test)
#y_pred_prob = model.predict_proba(X_test)[:, 1]


# 6.将预测结果和 PassengerId 合并为一个 DataFrame
result_df = pd.DataFrame({
    'PassengerId': test_data['PassengerId'],
    'Survived': y_pred
})

print('预测结果:')
print(result_df.head())
# 7.将预测结果保存为 CSV 文件
result_df.to_csv('data/titanic_prediction.csv', index=False)


线性回归和逻辑回归是机器学习的基础
分类和回归也是机器学习的两个最重要的分支!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值