Matlab对泰坦尼克号数据预处理

Matlab对泰坦尼克号数据预处理

  • 介绍
  • 实验步骤
    • 读取数据
    • 无缺失的属性
    • 缺失属性
    • 归一化
    • 归一化图
  • 程序代码

介绍

最近有人托我写类似于泰坦尼克号生存预测的程序,不过人家还没想好用什么方法,所以在此我又把以前用python写过的泰坦尼克号翻出来用matlab写一遍。
泰坦尼克号数据的下载与介绍就不多说了,我以前的博文都写过。

实验步骤

读取数据

[num,txt,raw]=xlsread('titanic3.xls');%读取数据,num返回的是excel中的数据,txt输出的是文本内容,row输出的是未处理数据
%挑出需要的数据
need=[2,1,4,5,6,7,9,11];
raw=raw(2:end-1,need);%'survived','pclass','sex','age','sibsp','parch','fare','embarked'

因为数据里既有数字也有文字,所以取元胞raw来进行数据处理。

无缺失的属性

对于无缺失值、并且取值为数字的属性,可以通过cell2mat直接转为矩阵。

date_mat(:,2)=cell2mat(raw(:,2));%无缺失值直接转

而对于无缺失、取值为文字的属性,则需要将文字转换为数字。
这里w_string是该属性所有的文字枚举元胞,data中与w_string里第1个文字段相同的将被转为1。

function [data_list]=wz2num(data,w_string)% 文字->数字
%输入为元胞,输出为数组
    data_list=zeros(size(data))*nan;
    %cc=tabulate(data);
    for j=1:length(w_string)
        bb=strcmp(data,w_string(j));
        data_list(find(bb==1))=j;
    end
end

缺失属性

对于有缺失的数据,需要想方设法填充,数据缺失的话应该是无法训练的。或许有高手不需要填充缺失数据,小弟不才,对这方面了解不多。所以我要把缺失数据填充完整,并且方法简单粗暴。

function [data_list]=fillmis(data,method,n,k,w_string)%缺失值填充
%data:数据元胞,method:方法,n:数字or文字,k:方法的范围/,w_string:文字列表
    if(n)%如果是数字
        data_list=cell2mat(data);
        data_list=fillmissing(data_list,method,k);
        while(sum(isnan(data_list)))
            data_list=fillmissing(data_list,method,k);
        end
    else
        %data_list=zeros(size(data))*nan;
        [data_list]=wz2num(data,w_string);
        data_list=fillmissing(data_list,method,k);%'movmedian'
        while(sum(isnan(data_list)))
            data_list=fillmissing(data_list,method,k);
        end
        %tabulate(data_list)
    end
end

fillmissing是matlab自带的填充函数,它有以下几个方法可以选择
Matlab对泰坦尼克号数据预处理_第1张图片
Matlab对泰坦尼克号数据预处理_第2张图片
这里加while是为了防止有些缺失地方没有被填充。

归一化

[date_x,PS] = mapminmax(date_mat',0,1);

需要注意的是mapminmax认为同一行是一个属性,对行进行归一化。

归一化图

xx=1:size(date_x,2);yy=1:size(date_x,1);
image(xx,yy,date_x,'CDataMapping','scaled');colormap('jet');
colorbar
title('归一化颜色图');

Matlab对泰坦尼克号数据预处理_第3张图片

程序代码

function [x,y]=date_inscet()

[num,txt,raw]=xlsread('titanic3.xls');%读取数据,num返回的是excel中的数据,txt输出的是文本内容,row输出的是未处理数据
%挑出需要的数据
need=[2,1,4,5,6,7,9,11];
raw=raw(2:end-1,need);%'survived','pclass','sex','age','sibsp','parch','fare','embarked'
date_mat=zeros(size(raw));
%% 数据处理
date_mat=zeros(size(raw));
%w_string={'male' ,'female'};
date_mat(:,2)=cell2mat(raw(:,2));%无缺失值直接转
date_mat(:,3)=wz2num(raw(:,3),{'male' ,'female'});%性别(文字-》数字)
date_mat(:,4)=fillmis(raw(:,4),'movmean',1,10,0);%年龄缺失值填充
date_mat(:,5)=cell2mat(raw(:,5));
date_mat(:,6)=cell2mat(raw(:,6));
date_mat(:,7)=fillmis(raw(:,7),'movmean',1,20,0);%均值填充
date_mat(:,8)=fillmis(raw(:,8),'movmedian',0,100,{'C' ,'Q','S'});%中位数填
%归一化
[date_x,PS] = mapminmax(date_mat',0,1);
date_x=date_x';
%画归一化后的图
xx=1:size(date_x,2);yy=1:size(date_x,1);
image(xx,yy,date_x,'CDataMapping','scaled');colormap('jet');
colorbar
title('归一化颜色图');%xlabe1('特征');ylabel('个体');
x=date_x(:,2:end);
y=cell2mat(raw(:,1));
end

function [data_list]=wz2num(data,w_string)% 文字->数字
%输入为元胞,输出为数组
    data_list=zeros(size(data))*nan;
    %cc=tabulate(data);
    for j=1:length(w_string)
        bb=strcmp(data,w_string(j));
        data_list(find(bb==1))=j;
    end
end
function [data_list]=fillmis(data,method,n,k,w_string)%缺失值填充
%data:数据元胞,method:方法,n:数字or文字,k:方法的范围/,w_string:文字列表
    if(n)%如果是数字
        data_list=cell2mat(data);
        data_list=fillmissing(data_list,method,k);
        while(sum(isnan(data_list)))
            data_list=fillmissing(data_list,method,k);
        end
    else
        [data_list]=wz2num(data,w_string);
        data_list=fillmissing(data_list,method,k);%'movmedian'
        while(sum(isnan(data_list)))
            data_list=fillmissing(data_list,method,k);
        end
    end
end

你可能感兴趣的:(Matlab,matlab)