sklearn学习记录(菜菜——泰坦尼克号生存者预测)

本文介绍了如何使用sklearn库对泰坦尼克号数据集进行预处理,包括删除无关列、处理缺失值、编码分类变量,然后构建决策树模型,并通过GridSearchCV进行参数优化。
摘要由CSDN通过智能技术生成

sklearn学习记录(菜菜——泰坦尼克号生存者预测)

一、数据探索

源自kaggle数据集

import pandas as pd
data=pd.read_csv("./data.csv")
data.head()

在这里插入图片描述


data.info()

在这里插入图片描述


labels=data["Embarked"].unique().tolist()
print(labels)

在这里插入图片描述


二、预处理与模型

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt

(1)预处理

data=pd.read_csv("./data.csv")

#删去无关列及缺失值过多的列
'''
data.drop用于删除指定的行或列
DataFrame.drop(labels=None, axis=0, index=None, columns=None, level=None, inplace=False, errors='raise')
参数:
labels: 要删除的行或列的标签。可以是单个标签(字符串或整数)或标签的列表。如果删除多个标签,使用列表。
axis: 指定删除的轴,0 表示删除行,1 表示删除列。
index: 用于指定要删除的行的索引,功能与 labels 相同,只是在某些情况下更易读。
columns: 用于指定要删除的列的标签,功能与 labels 相同,只是在某些情况下更易读。
level: 用于指定删除的多层索引的级别。
inplace: 如果设置为 True,则表示在原始 DataFrame 上进行就地修改,而不返回新的 DataFrame。默认是 False。
errors: 用于指定如果 labels 或 index 中的某个标签不存在时的处理方式。可以是 'raise'(默认,抛出异常)、'coerce'(将不存在的标签设为 NaN)、'ignore'(忽略不存在的标签)。
'''
data.drop(["Cabin","Name","Ticket"],inplace=True,axis=1)

#处理缺失值(缺多的填补,缺少的删除)
'''
对 "Age" 列中的缺失值进行填充,用该列的均值进行填充。
'''
data["Age"]=data["Age"].fillna(data["Age"].mean())

'''
对 DataFrame 中包含缺失值的行进行删除
'''
data=data.dropna()

#将分类变量转变为数值型变量

#将二分类变量转变为数值型变量
'''
astype能够将一个pandas对象转换为某种类型,
和apply(int(x))不同,
astype可以将文本类转换为数字,
用这个方式可以很便捷地将二分类特征转换为0~1
'''

'''
(data["Sex"]=="male"): 这是一个条件判断,对 "Sex" 列中的每个元素进行判断是否等于 "male",
这将返回一个包含布尔值的 Pandas Series
.astype("int"): 这是 Pandas Series 对象的方法,用于将 Series 中的元素的数据类型转换为整数,
在这里,将布尔值转换为整数,
True 转换为 1,False 转换为 0
'''
data["Sex"]=(data["Sex"]=="male").astype("int")

#将三分类变量转换为数值型变量
'''
.unique(): 这是 Pandas Series 对象的方法,用于获取该 Series 中的唯一值,
返回一个包含唯一值的数组。
.tolist(): 这是将数组或列表转换为 Python 列表的方法
'''
labels=data["Embarked"].unique().tolist()

'''
.apply():这是 Pandas Series 对象的方法,用于对 Series 中的每个元素应用指定的函数
labels.index(x):用于获取指定元素 x 在列表中的索引位置
lambda x: labels.index(x):这是一个匿名函数(lambda 函数),
用于将 "Embarked" 列中的每个元素映射到 labels 列表中对应的索引位置
'''
'''
lambda arguments: expression
lambda: 关键字,用于指示创建一个匿名函数
arguments: 参数列表,类似于常规函数的参数
expression: 表达式,函数的返回值
'''
data["Embarked"]=data["Embarked"].apply(lambda x:labels.index(x))

#查看处理后的数据集
data.head()

在这里插入图片描述


#提取标签和特征矩阵,分测试集和训练集
'''
data.iloc[row_indexer, column_indexer]
参数:
row_indexer: 表示行的索引器,可以是整数、整数列表、切片、布尔数组或数组。用于选择行
column_indexer: 表示列的索引器,可以是整数、整数列表、切片、布尔数组或数组。用于选择列

data.loc[row_indexer, column_indexer]
参数:
row_indexer: 表示行的索引器,可以是标签、标签列表、切片、布尔数组或数组。用于选择行
column_indexer: 表示列的索引器,可以是标签、标签列表、切片、布尔数组或数组。用于选择列

区别:
索引方式:
data.iloc 使用整数位置进行索引
data.loc 使用标签进行索引

切片方式:
data.iloc 使用 Python 的标准切片规则(不包括结束位置)
data.loc 使用包含结束位置的切片规则

用途:
data.iloc 适用于基于整数位置的索引,适用于通过行号和列号进行选择
data.loc 适用于基于标签的索引,适用于通过标签名称进行选择
'''
x=data.iloc[:,data.columns!="Survived"]
y=data.iloc[:,data.columns=="Survived"]

xtrain,xtest,ytrain,ytest=train_test_split(x,y,test_size=0.3)
print(xtrain.index)

在这里插入图片描述


#修正测试集和训练集的索引
'''
for i in [xtrain, xtest, ytrain, ytest]:: 这是一个循环语句,
遍历了一个包含训练集 xtrain、测试集 xtest、训练集标签 ytrain 以及测试集标签 ytest 的列表

i.index = range(i.shape[0]): 这行代码将每个数据集的索引修改为从零开始的递增整数
具体解释如下:
i: 在每次迭代中,i 分别代表了列表中的每个数据集
i.shape[0]: 表示数据集的行数
range(i.shape[0]): 生成一个从0开始到 i.shape[0] - 1 的整数范围
i.index = range(i.shape[0]): 将数据集的索引修改为这个整数范围
'''
for i in [xtrain,xtest,ytrain,ytest]:
    i.index=range(i.shape[0])

#查看分好的训练集和测试集
xtrain.head()

在这里插入图片描述


(2)模型

#导入模型,粗略跑一下查看结果
clf=DecisionTreeClassifier(random_state=25)
clf=clf.fit(xtrain,ytrain)
score1=clf.score(xtest,ytest)
print(score1)
scorek=cross_val_score(clf,x,y,cv=10).mean()
print(scorek)

在这里插入图片描述


#在不同max_depth下观察模型的拟合状况
s1=[]
sk=[]
for i in range(10):
    clf=DecisionTreeClassifier(random_state=25,
                               max_depth=i+1,
                               criterion='entropy'
                               )
    clf=clf.fit(xtrain,ytrain)
    '''
    score_1,score_k分别用于评估机器学习模型在训练集(拟合程度)和整个数据集上(泛化能力)的性能
    '''
    score_1=clf.score(xtrain,ytrain)
    score_k=cross_val_score(clf,x,y,cv=10).mean()
    s1.append(score_1)
    sk.append(score_k)
print(max(s1),'\n',max(sk))

在这里插入图片描述


#绘图
plt.plot(range(1,11),s1,color='red',label='train')
plt.plot(range(1,11),sk,color='blue',label='test')
'''
xticks:横坐标标尺
'''
plt.xticks(range(1,11))
plt.legend()
plt.show()

在这里插入图片描述


#用网格搜索调整参数(本质为枚举)
import numpy as np
'''
gini_thresholds用于定义一系列阈值,在决策树等模型中用于选择分裂点

numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数:
start: 数列的起始值。
stop: 数列的终止值。
num: 要生成的等间隔样本数量。默认值是50。
endpoint: 如果为 True,则包括 stop 的值;如果为 False,则不包括。默认值是 True。
retstep: 如果为 True,返回 (samples, step),其中 step 是样本之间的间隔。
dtype: 输出数组的数据类型。如果未提供,将从其他输入参数中推断数据类型。
'''
gini_thresholds=np.linspace(0,0.5,20)

'''
range(1,10) 创建了一个包含整数1到9的范围对象,使用 [*...] 语法,将范围对象解包为一个列表,
可以使用 list(range(1, 10)) 来实现相同的效果
'''
parameters={'splitter':('best','random'),
            'criterion':('gini','entropy'),
            'max_depth':[*range(1,10)],
            'min_samples_leaf':[*range(1,50,5)],
            'min_impurity_decrease':[*np.linspace(0,0.5,20)]
            }

clf=DecisionTreeClassifier(random_state=25)

'''
GridSearchCV:一个模型调优工具,用于系统地搜索给定参数网格中的最佳超参数组合
GS = GridSearchCV(estimator, param_grid, scoring=None, cv=None, n_jobs=None, verbose=0, return_train_score=False)
参数:
estimator: 指定的机器学习模型(分类器或回归器)。
param_grid: 待搜索的超参数字典,其中键是模型的超参数名称,对应的值是超参数的候选值列表。
scoring: 评分策略,用于评估候选模型。默认为使用模型的 score 方法。
cv: 指定交叉验证的折数。
n_jobs: 并行执行的作业数量,如果为 -1,则使用所有可用的 CPU。
verbose: 控制输出的详细程度。0 表示没有输出,大于 0 的值表示输出详细程度。
return_train_score: 如果为 True,则返回训练集上的得分。

GS.fit(X, y):用于在给定的超参数网格上执行网格搜索。
参数:
X: 特征矩阵。
y: 目标变量。

GS.best_params_:返回搜索过程中找到的最佳超参数组合。
GS.best_estimator_:返回使用最佳超参数训练的最佳估计器。
GS.cv_results_:返回一个字典,包含了在整个参数网格上进行交叉验证的详细结果。
GS.best_score_:用于获取在交叉验证中得到的最佳模型性能得分。
'''
GS=GridSearchCV(clf,parameters,cv=10)
GS.fit(xtrain,ytrain)

print(GS.best_params_)

print(GS.best_score_)

在这里插入图片描述


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值