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_)
决策树---实现泰坦尼克号预测(记录细节API)
最新推荐文章于 2023-01-05 17:36:07 发布