这次我们使用朴素贝叶斯的方法来解决这个问题,我的这个方法还是没有得很高的分数,74.641,归根可能是标量数据处理不够到位,因此瓶颈总是过不去,不是朴素贝叶斯算法的问题。
贝叶斯通过先验概率和最大似然概率去估计事件出现的可能性。
P(存活与否 | 基本条件)*P(基本条件)=P( 基本条件|存活与否 )*P(存活与否 )
对式子进行化简
P(存活与否 | 多组条件)=P( 多组条件|存活与否)*存活率 (如果各个条件相互独立存在,那么有如下的推论)
=P(条件1|存活)*P(条件2|存活)*...*P(条件n|存活)*存活率
于是,我们的任务就转换为分别使用幸存者和死亡者的数据,分别计算各个特征的存活率和死亡率。
然后根据测试样本具备的特征组,将各个特征乘起来,就可以得到具备这组条件的人的p(多组条件|存活)和p(多组条件|死亡) 最大似然概率,然后各自分别和先验概率:整体存活率和整体的死亡率相乘,计算具备这组条件生还和死亡的最终概率。比较下面两个概率那个大,判断生死。
P(基本条件|死亡) *p(整体死亡率) P(基本条件|存活) *p(整体存活率)
那个更大,我们就预测那个可能性更大。
数据处理和朴素贝叶斯py
# -*- coding: utf-8 -*-
'''
Created on Oct 12, 2010
Decision Tree Source Code for Machine Learning in Action Ch. 3
@author: Peter Harrington
'''
from math import log
import operator
import numpy as np
from numpy import *
import pandas as pd
from kaggleJudge import *
import kaggleJudge as kj
import treePlotter as tp
import random
import scipy as sp
def cleanData(dataframe):
df=dataframe
#判断字段的空值状况,自动化
df.isnull().sum() #通过判断为空的数量,来判断为空的数目,其中False=0,True=1嘛
#整理字段
df['Gender']=df['Sex'].map({'male':0,'female':1}).astype(int)
df=df.drop(['Cabin','Sex','Name','Ticket'],axis=1)
#填充空值字段
#按照gender,class进行groupby聚类然后填充这个分组的平均值
ageArr=np.zeros((2,3))
for i in range(2):
for j in range(3):
ageArr[i,j]=df[ (df['Gender']==i) & (df['Pclass']==j+1) ]['Age'].dropna().mean()
# 自我赋值df[ (df['Gender']==i) & (df['Pclass']==j+1) ]=df[ (df['Gender']==i) & (df['Pclass']==j+1) ].fillna(ageArr[i,j])
df.loc[(df['Gender']==i) & (df['Pclass']==j+1) &(df['Age'].isnull()), 'Age']=ageArr[i,j]
#填充test数据的Far