机器学习实战(零)——泰坦尼克数据处理

本系列是针对《机器学习实战》蜥蜴书第二版自己的总结,结合吴恩达的ML课部分理论内容。

这里拿泰坦尼克这个经典例子来说明对于机器学习算法的数据清洗技术。

观察数据

首先从kaggle下载数据得到 train.csv 和 test.csv

加载数据

train_data = pd.read_csv('drive/Colab Notebooks/ml/datasets/titanic/train.csv')
test_data = pd.read_csv('drive/Colab Notebooks/ml/datasets/titanic/test.csv')

查看一下表的基本信息:

train_data.head()

在这里插入图片描述
得到相应列:

  • Survived:目标数据,0-死亡,1-生存
  • Pclass: 乘客所属类别
  • Name, Sex, Age: 个人信息
  • SibSp: 乘客在船上的配偶人数
  • Parch: 乘客在船上的孩子、父母的人数
  • Ticket: 票号
  • Fare: 消费
  • Cabin: 所在船舱号
  • Embarked: 在何处上船

查看有多少缺失数据

train_data.info()

在这里插入图片描述
年龄、船舱号、上船位置有部分缺失,且船舱号大量缺失,后期可考虑舍弃。

查看数值列:

train_data.describe()

在这里插入图片描述
可以从上面数据发现:

  • 仅有38%的人存活,也就说明模型估计的目标也应该在40%左右。
  • 平均费用达到了32法郎,船上消费没有想象中的昂贵。
  • 乘客平均年龄在30岁以下。

查看分类的特征:

train_data["Pclass"].value_counts()

在这里插入图片描述

train_data["Sex"].value_counts()

在这里插入图片描述

train_data["Embarked"].value_counts()

在这里插入图片描述

数据转换

建立一个DataframeSelector类来筛选特征:

from sklearn.base import BaseEstimator, TransformerMixin

class DataFrameSelector(BaseEstimator, TransformerMixin):
    def __init__(self, attribute_names):
        self.attribute_names = attribute_names
    def fit(self, X, y=None):
        return self
    def transform(self, X):
        return X[self.attribute_names]

建立num_pipeline处理数值数据

from sklearn.pipeline import Pipeline
from sklearn.impute import SimpleImputer

#将数值特征筛选后,用中位数填补空缺值
num_pipeline = Pipeline([
        ("select_numeric", DataFrameSelector(["Age", "SibSp", "Parch", "Fare"])),
        ("imputer", SimpleImputer(strategy="median")),
    ])

处理后的数据:

num_pipeline.fit_transform(train_data)

在这里插入图片描述

将类别特征转换成矩阵

# 用最常出现的类别填充空类别
class MostFrequentImputer(BaseEstimator, TransformerMixin):
    def fit(self, X, y=None):
        self.most_frequent_ = pd.Series([X[c].value_counts().index[0] for c in X],
                                        index=X.columns)
        return self
    def transform(self, X, y=None):
        return X.fillna(self.most_frequent_)

针对类别的cat_pipeline,并进行onehot编码:

from sklearn.preprocessing import OneHotEncoder
cat_pipeline = Pipeline([
        ("select_cat", DataFrameSelector(["Pclass", "Sex", "Embarked"])),
        ("imputer", MostFrequentImputer()),
        ("cat_encoder", OneHotEncoder(sparse=False)),
    ])
cat_pipeline.fit_transform(train_data)

在这里插入图片描述
将分类pipline和数值pipline融合:

from sklearn.pipeline import FeatureUnion
preprocess_pipeline = FeatureUnion(transformer_list=[
        ("num_pipeline", num_pipeline),
        ("cat_pipeline", cat_pipeline),
    ])

最后fitpipline:

X_train = preprocess_pipeline.fit_transform(train_data)
X_train

设定目标列,处理完成:

y_train = train_data["Survived"]

用svc进行预测

训练模型

from sklearn.svm import SVC

svm_clf = SVC(gamma="auto")
svm_clf.fit(X_train, y_train)

在这里插入图片描述
训练完成,接下来预测试试:

X_test = preprocess_pipeline.transform(test_data)
y_pred = svm_clf.predict(X_test)

交叉验证:

from sklearn.model_selection import cross_val_score

svm_scores = cross_val_score(svm_clf, X_train, y_train, cv=10)
svm_scores.mean()

在这里插入图片描述
结果还不错。

到这里学习机器学习的准备工作就完成了,这里总结一下数据处理的流程

  1. 利用pandas和numpy来完成数据准备,确定有哪些数据和缺失值如何处理
  2. 利用sklearn的BaseEstimator,TransformerMixin完成特征筛选
  3. 利用pipline,imputer完成缺失值填补,矩阵转换
  4. 特别的,表示类别的特征需要用OneHotEncoder来进行编码。
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值