每天学习一点点,开始啦!
记录自己的成长史,哈哈哈😄😃😁
导入的路径书写格式:
- 直接复制路径在路径前加字母r,如:pd.read_csv(r'C:\Program Files');
- 将复制的路径的下划线改为向左的下划线,如:pd.read_csv('C:/Program Files');
基本思路:
- 导入需要用到的库
- 导入数据集,探索数据
- 对数据进行预处理
- 提取标签和特征矩阵,分测试集和训练集
- 导入模型,粗略地看一下结果
- 在不同max_depth下观察模型的拟合状况,调参(效果仍然不太理想)
- 用网格搜索调整参数
注意事项:
1、在第三步对数据进行预处理时,可以删除缺失值过多的列和对观察判断来说和预测值y没有关系的列;
对于数据的分类(二分类和多分类)
二分类变量类型的转变:
# 决策树无法处理文字,将分类变量变成数值型变量
# 将二分类变量转换成数值型变量
# astype能够将一个pandas对象准换为某种类型,和apply(int(x))不同,
# astype可以将文本转换成数字,用这个方式可以很便捷地将二分类特征转换为0~1
# 这里是指里面已经是布尔类型了,将这个类型转换为int类型,因为布尔型就是指true是1,false是0
# loc[:,'Sex']是指所有的行,Sex这一列取出来;
data.loc[:,'Sex'] = (data['Sex'] == 'male').astype('int')
多分类变量类型的转变(以三分类做说明):
# 将三分类变量转换为数值型变量
labels = data['Embarked'].unique().tolist() # 将数组变为列表
# apply 指的是在这一列执行我指定的操作
# 相当于将“Embarked”的每一行数据取列表的项的索引
data['Embarked'] = data['Embarked'].apply(lambda x: labels.index(x))
# 查看处理后的数据集
data.head()
2、在第四步,应当修正测试集和训练集的索引,相当于将索引转换成从0开始递增的索引。很重要!!!!必须要修改
可以做一个循环,如:
for i in [Xtrain,Xtest,Ytrain,Ytest]:
i.index = range(i.shape[0])
3、在第7步,一般都到第6步就结束了,当模型十分不理想时,利用网格搜索,但网格搜索时间长,需要对进行的搜索的范围进行一个规定,否则,机器会被跑死的。
如:
import numpy as np
gini_thresholds = np.linspace(0,0.5,20) # 从某个区间取出有顺序的20个数,随机的
# entropy_thresholds = np.linspace(0,1,20)
# parameters是指一串参数和这些参数对应的,我们希望网络搜索来搜索的参数的取值范围,它是个字典
# 这个是一个一个的参数的名字对应的参数的取值的字典,一个个拿出来进行匹配
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)
# 第一个参数是想要进行网路搜索的模型,告诉他有着某些参数的列表,第三个交叉验证的次数
GS = GridSearchCV(clf, parameters, cv=10)
# 用训练集进行fit
GS.fit(Xtrain,Ytrain)
# 从我们输入的参数和参数值的列表中,返回最佳组合
GS.best_params_
# 网格搜索后的模型的评判标准
GS.best_score_