基于titanic数据集的分类器构建---(一)处理数据

看完刘老师的pytorch加载数据集的课后,来完成一下作业

作业内容:构建一个基于titanic数据集的分类器

关于titanic数据集的介绍

  • Titanic - Machine Learning from Disaster | Kaggle下载训练集
  • 该数据集有11个特征位,1个结果(surviced),本次作业的目标就是由11个特征位得出该乘客是否存活
  • 每个特征位的说明在上述网站有说明

第一步.加载数据集

原始代码,报错原因:could not convert string to float: 'PassengerId'

class Titanicdataset(Dataset):
    def __init__(self,filepath):
        xy = np.loadtxt(filepath,delimiter=',',dtype=np.float32)
        self.len = xy.shape[0]
        self.x_data = torch.from_numpy(xy)
        self.x_data = np.delete(self.x_data,1)#去掉结果列
        self.y_data = torch.from_numpy(xy[:,[1]])#survived是下标为1的列
    def __getitem__(self, item):
        return self.x_data[item],self.y_data[item]
    def __len__(self):
        return self.len

笔者后来百度网友们的方案发现大家加载数据集使用panda的pd.read_csv,numpy的loadtxt和panda的read_csv都可以加载,但数据两者的区别是

  • loadtxt以array的形式读取数据,而read_csv以dataframe(matrix)的形式读取数据;

由于读取的数据形式不同,dataframe的优势是可以对数据进行很多操作,例如缺失值处理、合并或截取数据等,这也是笔者在处理数据集时遇到的问题,titanic数据集都每一列数据有的是int型,有的是float,还有的是string。

xy = pd.read_csv('datafile/train.csv')
#显示数据集每一列的类型,数据个数
print(xy.info())
#显示数据的前5行
print(xy.head())

结果截图:

第二步:缺失数据处理

关于数据缺失,有以下办法:

  • 如果数据集很多,但有很少的缺失值,可以删掉带缺失值的行;
  • 如果该属性相对学习来说不是很重要,可以对缺失值赋均值或者众数。
  • 对于标称属性,可以赋一个代表缺失的值,比如‘U0’。因为缺失本身也可能代表着一些隐含信息。比如船舱号Cabin这一属性,缺失可能代表并没有船舱。

 由于Age、Cabin、Embarked字段数据缺失,将其补齐

Embarked字段采用众数填充

import pandas as pd
xy = pd.read_csv('datafile/train.csv')
#填充前
print(xy.info())
#输出众数,结果为‘S’
print(xy['Embarked'].dropna().mode().values)
#缺失值填充
xy.loc[:, 'Embarked'] = xy['Embarked'].fillna('S')
#填充后查看是否填充成功
print(xy.info())

Cabin字段表示乘客的舱位,没有填写可能表达没有舱位,所以用自定义值标记即可

xy.loc[:, 'Cabin'] = xy['Cabin'].fillna('U0')

Age字段对模型影响比较大选择多种方法进行补充:
笔者选择使用随机森林回归的方法对模型进行训练用来预测Age的值

#选择对年龄有影响数据
age_df = xy[['Age','Survived','Fare', 'Parch', 'SibSp', 'Pclass']]
#分为训练集
age_df_notnull = age_df.loc[(xy['Age'].notnull())]
#和测试集
age_df_isnull = age_df.loc[(xy['Age'].isnull())]

X = age_df_notnull.values[:,1:]
Y = age_df_notnull.values[:,0]

# n_job=-1CPU并行计算的核数(设置为-1表示对CPU核数不限制)
#实例化
RFR = RandomForestRegressor(n_estimators=100, n_jobs=-1)
#训练模型
RFR.fit(X,Y)
#预测数据
predictAges = RFR.predict(age_df_isnull.values[:,1:])
print(predictAges.shape)
#填充
xy.loc[xy['Age'].isnull(), ['Age']]= predictAges

关于随机森林回归法的简单介绍

定义晦涩,还是举个例子容易理解,比如这里要预测年龄,就选取了与年龄有关的一些因素,如这里'Fare', 'Parch', 'SibSp', 'Pclass'来构建多个决策树,每棵决策树都会独立的做出决定。

  • 假设现在针对的是分类问题,那么对于一个输入样本,N棵树会有N个分类结果。而随机森林集成了所有的分类投票结果,将投票次数最多的类别指定为最终的输出,这就是一种最简单的 Bagging 思想。
  • 如果针对回归问题,每棵树都会对年龄做出一个预测,最后取均值

最主要的两个参数是n_estimators和max_features。

n_estimators:表示森林里树的个数。理论上是越大越好。但是伴随着就是计算时间的增长。但是并不是取得越大就会越好,预测效果最好的将会出现在合理的树个数。

max_features:随机选择特征集合的子集合,并用来分割节点。子集合的个数越少,方差就会减少的越快,但同时偏差就会增加的越快。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值