7. 9月26日 泰坦尼克号生还预测2-模型构建与推理
7. 9月26日 泰坦尼克号生还预测2-模型构建与推理
算法
逻辑回归(Logistic Regression)
逻辑回归是一种广泛使用的统计模型,它在数据集中存在一个或多个自变量(解释变量)和一个因变量(目标变量)的情况下,用来预测二分类结果的概率。尽管名字中有“回归”二字,但它实际上是一种分类算法。逻辑回归通过使用逻辑函数(通常是Sigmoid函数)将线性回归的输出映射到0和1之间,从而预测一个事件发生的概率。
随机森林(Random Forest)
随机森林是一种集成学习方法,它通过构建多个决策树并将它们的预测结果进行整合来提高预测准确性和控制过拟合。随机森林的核心思想是“集思广益”,即通过组合多个模型的预测来获得更好的性能。
随机森林的构建过程包括以下步骤:
- 从原始数据集中随机抽取样本(有放回抽样),构建多个训练集。
- 对于每个训练集,构建一个决策树。
- 在构建每棵树时,对于每个决策点,从所有可用的特征中随机选择一部分特征,以增加树之间的多样性。
- 对于分类问题,最终的预测结果是通过多数投票的方式确定的;对于回归问题,则是通过取多棵树预测结果的平均值来确定的。
随机森林的优点包括:
- 能够处理大量的数据。
- 对于特征缺失和异常值有很好的鲁棒性。
- 不需要参数调整,易于使用。
- 可以给出特征的重要性评分。
这两种方法都是机器学习中非常流行的算法,适用于不同的场景和问题。逻辑回归通常用于二分类问题,而随机森林则适用于分类和回归问题,并且能够处理更复杂的数据结构。
逻辑回归的实现
在之前数据处理的代码基础上
导入必要的库
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
train_test_split用于将数据集划分为训练集和测试集。LogisticRegression是逻辑回归模型的实现。accuracy_score用于计算模型预测的准确率。
准备数据
X = train_data[['Pclass', 'Sex', 'Age', 'SibSp','Parch','Fare', 'Embarked']] # 特征变量
y = train_data['Survived'] # 目标变量
X是特征变量,从train_data数据集中选取了Pclass(船舱等级)、Sex(性别)、Age(年龄)、SibSp(兄弟姐妹/配偶数量)、Parch(父母/子女数量)、Fare(船票价格)和Embarked(登船港口)作为特征。y是目标变量,即train_data中的Survived列,表示乘客是否存活。
划分数据集
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
- 使用
train_test_split函数将数据集分为训练集和测试集,其中测试集占总数据的20%(test_size=0.2),random_state=42确保每次划分都是一致的,以便于复现结果。
在机器学习中,random_state 参数用于指定随机数生成器的种子值。设置这个参数可以确保每次运行代码时,随机操作(如数据划分、参数初始化等)的结果都是可重复的。
random_state=42是一个常用的种子值,用于确保实验的可重复性。你可以选择其他整数作为种子值,但通常42是一个常用的选择,因为它在科幻小说《银河系漫游指南》中是一个有趣的数字。
数字 42 在科幻小说《银河系漫游指南》(The Hitchhiker's Guide to the Galaxy)中非常有名。在这部小说中,42 是被描述为“生命、宇宙以及任何事情的终极答案”。这个幽默的设定使得 42 成为了科幻爱好者和流行文化中的一个标志性数字。
在编程和数据科学中,人们有时会出于对这部小说的喜爱而将 42 作为默认的随机种子值。使用 42 作为 random_state 参数的值是一种传统,它确保了代码的可重复性,同时也带有一定的趣味性。
创建逻辑回归模型:
# 创建逻辑回归模型
model = LogisticRegression()
- 实例化
LogisticRegression类创建一个逻辑回归模型。
训练模型:
model.fit(X_train, y_train)
使用fit方法训练模型,输入训练集的特征变量X_train和目标变量y_train。
预测测试集:
y_pred = model.predict(X_test)
使用训练好的模型对测试集X_test进行预测,得到预测结果y_pred。
这时我们有了真实数据 y_test 和预测数据 y_pred
模型评估:
accuracy = accuracy_score(y_test, y_pred)
print(f'准确率: {accuracy:.2f}')
使用accuracy_score函数计算模型在测试集上的准确率,即将预测结果y_pred与实际结果y_test进行比较,计算正确预测的比例。
打印出准确率,格式化为保留两位小数。
保存模型
from joblib import dump
# 保存模型到文件
dump(model, 'logistic_regression_model.joblib')
加载模型(不做)
只是示例,不做
from joblib import load
# 加载之前保存的模型
model = load('logistic_regression_model.joblib')
# 使用模型进行预测
y_pred = model.predict(X_test)
# 计算准确率
accuracy = accuracy_score(y_test, y_pred)
print(f'准确率: {accuracy:.2f}')
逻辑回归的测试
导入必要库
from joblib import load
import pandas as pd
from sklearn.metrics import accuracy_score
加载模型
就是刚才生成的
model = load('logistic_regression_model.joblib')
加载数据
一个是测试,一个是答案
# 加载数据
test_data = pd.read_csv(r'data\test.csv')
submission_data = pd.read_csv(r'data\submission.csv')
数据预处理
略
test_data['Age'] = test_data['Age'].fillna(test_data['Age'].median())
test_data['Embarked'] = test_data['Embarked'].fillna('S')
test_data.loc[test_data['Sex'] == 'male', 'Sex'] = 0
test_data.loc[test_data['Sex'] == 'female', 'Sex'] = 1
test_data.loc[test_data['Embarked'] == 'S', 'Embarked'] = 0
test_data.loc[test_data['Embarked'] == 'C', 'Embarked'] = 1
test_data.loc[test_data['Embarked'] == 'Q', 'Embarked'] = 2
预测:
test_data['Survived'] = model.predict(test_data[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']])
# 保存预测结果
submission = pd.DataFrame({
'PassengerId': test_data['PassengerId'],
'Survived': test_data['Survived']
})
submission.to_csv('predicted_submission.csv', index=False)
使用加载的模型和处理后的数据进行预测,预测结果存储在 'Survived' 列中。
保存预测结果:
创建一个新的 DataFrame,包含 'PassengerId' 和预测的 'Survived' 列。
将这个 DataFrame 保存为 'predicted_submission.csv'。
计算准确率:
从提交数据中读取真实的 'Survived' 值。
从预测结果中读取预测的 'Survived' 值。
# 计算准确率
y_true = submission_data['Survived']
y_pred = submission['Survived']
accuracy = accuracy_score(y_true, y_pred)
print(f'准确率: {accuracy:.2f}')
使用 accuracy_score 函数计算模型预测的准确率,并打印出来。

随机森林算法的实现
导入必要的库:
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
RandomForestClassifier 用于创建随机森林模型。
train_test_split 用于将数据集划分为训练集和测试集。
accuracy_score 用于计算模型的准确率。
准备数据:
# 准备数据
X = train_data[['Pclass', 'Sex', 'Age', 'SibSp','Parch','Fare', 'Embarked']] # 特征变量
y = train_data['Survived'] # 目标变量
X 是特征变量,从 train_data 数据集中选取了 Pclass(船舱等级)、Sex(性别)、Age(年龄)、SibSp(兄弟姐妹/配偶数量)、Parch(父母/子女数量)、Fare(船票价格)和 Embarked(登船港口)作为特征。
y 是目标变量,即 train_data 中的 Survived 列,表示乘客是否存活。
划分训练集和测试集:
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建随机森林模型
rf_model = RandomForestClassifier(n_estimators=100, random_state=42)
使用 train_test_split 函数将数据集分为训练集和测试集,其中测试集占总数据的20%(test_size=0.2),random_state=42 确保每次划分都是一致的,以便于复现结果。
创建随机森林模型:
实例化 RandomForestClassifier 类创建一个随机森林模型,设置决策树的数量为100(n_estimators=100),并设置随机种子为42(random_state=42)以确保结果的可重复性。
训练模型:
# 训练模型
rf_model.fit(X_train, y_train)
使用 fit 方法训练模型,输入训练集的特征变量 X_train 和目标变量 y_train。
预测测试集:
# 预测测试集
y_pred = rf_model.predict(X_test)
使用训练好的模型对测试集 X_test 进行预测,得到预测结果 y_pred。
模型评估:
accuracy = accuracy_score(y_test, y_pred)
print(f'准确率: {accuracy:.2f}')
使用 accuracy_score 函数计算模型预测的准确率,并打印出来。
保存模型
from joblib import dump
# 保存模型到文件
dump(rf_model, 'random_forest_model.joblib')
随机森林的测试
from joblib import load
import pandas as pd
from sklearn.metrics import accuracy_score
# 加载模型
model = load('random_forest_model.joblib')
# 加载数据
test_data = pd.read_csv(r'data\test.csv')
submission_data = pd.read_csv(r'data\submission.csv')
# 用中值填补缺失值
test_data['Age'] = test_data['Age'].fillna(test_data['Age'].median())
test_data['Embarked'] = test_data['Embarked'].fillna('S')
test_data.loc[test_data['Sex'] == 'male', 'Sex'] = 0
test_data.loc[test_data['Sex'] == 'female', 'Sex'] = 1
test_data.loc[test_data['Embarked'] == 'S', 'Embarked'] = 0
test_data.loc[test_data['Embarked'] == 'C', 'Embarked'] = 1
test_data.loc[test_data['Embarked'] == 'Q', 'Embarked'] = 2
test_data['Survived'] = model.predict(test_data[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']])
# 保存预测结果
submission = pd.DataFrame({
'PassengerId': test_data['PassengerId'],
'Survived': test_data['Survived']
})
submission.to_csv('predicted_submission.csv', index=False)
# 计算准确率
y_true = submission_data['Survived']
y_pred = submission['Survived']
accuracy = accuracy_score(y_true, y_pred)
print(f'准确率: {accuracy:.2f}')