决策树---实现泰坦尼克号预测(记录细节API)

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

# 使用分类树模型预测那些人可能称为幸存者,主要是分类树
data = pd.read_csv(r"D:\train.csv")
print(data.head()) # head()显示头信息,默认为5行
print(data.info()) # info()是查看数据类型,数据详情
"""
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
 #   Column       Non-Null Count  Dtype  
---  ------       --------------  -----  
 0   PassengerId  891 non-null    int64  
 1   Survived     891 non-null    int64  
 2   Pclass       891 non-null    int64  
 3   Name         891 non-null    object 
 4   Sex          891 non-null    object 
 5   Age          714 non-null    float64
 6   SibSp        891 non-null    int64  
 7   Parch        891 non-null    int64  
 8   Ticket       891 non-null    object 
 9   Fare         891 non-null    float64
 10  Cabin        204 non-null    object 
 11  Embarked     889 non-null    object 
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB
"""

# 拿到数据后,查看缺失值,数据类型,进行数据预处理
print(data.shape)
# 第一步:筛选特征, axis=1是对列的操作 删除没有用的特征
data.drop(['Cabin','Name','Ticket'],inplace=True,axis=1)
print(data.shape)

# 第二步:处理缺失值,使用fillna()API填充空值
print(data['Age'].fillna(data["Age"].mean()))
data["Age"] = data['Age'].fillna(data["Age"].mean())
print(data.info())
# 对于缺失值占比太少的情况,可以直接删除即可,选择行的情况就是,
# 如果这行中由缺失值,那么这行中所有的数据都得删除
data = data.dropna(axis=0) # 因为dropna中axis的默认为0,0也就是行
print(data.info())

# 查看列中有多少类型的值API--->unique()
print(data["Embarked"].unique()) # ['S' 'C' 'Q']
labels = data["Embarked"].unique().tolist()
data["Embarked"] = data["Embarked"].apply(lambda x: labels.index(x))
print(data["Embarked"])
print(data.info())
# 对于类型转数值,另一种方法,用T或者F,表达
data["Sex"] = (data["Sex"] == "male").astype("int")
print(data["Sex"])
print(data.info())
# 对于代码规范来说,在data["Sex"]这种写法,
# 应该改正为data.loc[:,"Sex"]或者用data.iloc[:,2]

# 第四步:把数据集中的x与y要分离开。所以用data.iloc[:,3]
# 这里面有个columns的API,主要是得到全部列名,
print(data.columns != "Survived") # [ True False  True  True  True  True  True  True  True]
x = data.iloc[:,data.columns != "Survived"] # 所以用判断可以得到除Survived列的所有列
y = data.iloc[:,data.columns == "Survived"] # 所以y值就可以用等于去判断了

# 第五步,实例化模型
xtrain,xtest,ytrain,ytest = train_test_split(x,y,test_size=0.3)
# 由于实例化数据集后,数据集的索引为乱序的,为了防止后续对数据操作,
# 所以先要对数据集的索引变为有序的
for i in [xtrain,xtest,ytrain,ytest]:
    i.index = range(i.shape[0]) # 因为shape求的是i这个数据集的行数,range()指的是把i.index值变为从0到i的总行数有序数据
print(xtest)
print(ytest)

# 调用API即可
clf = DecisionTreeClassifier(random_state=30)
# clf = clf.fit(xtrain,ytrain)
# score = clf.score(xtest,ytest)
# print(score)

# 使用交叉验证,
score = cross_val_score(clf,x,y,cv=10).mean()
print(score)

# 网格搜索求最佳参数值
parameters = {"criterion":("gini","entropy")
              ,"splitter":("best","random")
              ,"max_depth":[*range(1,10)]
              ,"min_samples_leaf":[*range(1,50,5)]
              ,"min_impurity_decrease":[*np.linspace(0,0.5,20)]
}

gs = GridSearchCV(clf,parameters,cv=10)
gs = gs.fit(xtrain,ytrain)
# 从我们输入的参数和参数取值的列表中,返回最佳组合
print(gs.best_params_)
print("-------")
# 网格搜索后的模型的评判标准
print(gs.best_score_)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值