kaggle Titanic 简单逻辑回归模型

参考文章点击打开链接

首先读取很多很多包和数据

#-*-coding:utf-8-*-
import pandas as pd
import numpy as np
from sklearn import preprocessing
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import learning_curve
import matplotlib.pyplot as plt
train=pd.read_csv('C:/kaggle/Titanic/train.csv')
test=pd.read_csv('C:/kaggle/Titanic/test.csv')

训练集中有两个上船位置的数据缺失,我们做一个简单的统计,发现一等舱的乘客在S港口上船的几率更大一些,所以我们将训练数据中上船位置的缺失诗句用S来补充,并将test中的一个缺失元素利用均值补上。

train=pd.read_csv('C:/kaggle/Titanic/train.csv')
test=pd.read_csv('C:/kaggle/Titanic/test.csv')
y1=train[train.Embarked=='C'].groupby('Pclass')['Pclass'].count()
y2=train[train.Embarked=='Q'].groupby('Pclass')['Pclass'].count()
y3=train[train.Embarked=='S'].groupby('Pclass')['Pclass'].count()
y=[y1,y2,y3]
#print y                                 #统计各个港口各船舱级别上船人数
train.Embarked.fillna('S')               #将缺失数据用S进行填充
#print test.loc[test.Fare.isnull()]
test.Fare.fillna(test[(test.Pclass==1)&(test.Embarked=='S')].Fare.mean(),inplace=True)#将test中的一个缺失元素利用均值补上上

对数据进行基本的处理,将拥有船舱号和没有船舱号分开,在删除姓名和票号列。

train['Cabin']=train['Cabin'].isnull().apply(lambda x:'Null'if x is True else 'Not Null')       #用isnull判断是否缺失,若缺失则为True,再将true替换为null,将False替换为Not Null
test['Cabin']=test['Cabin'].isnull().apply(lambda x:'Null'if x is True else 'Not Null')         #lambda是匿名函数
del train['Name'],train['Ticket']       #删除name列和ticket列
del test['Name'],test['Ticket']

将年龄分类,连续型变量离散化。

def age_map(x):
    if x<10:
        return '10-'
    if x>60:
        return '60+'
    elif x>=10 and x<60:
        return '%d-%d'%(x//5,x//5+5)
    else:
        return 'Null'
train['Age_map']=train['Age'].apply(lambda x:age_map(x))
print train['Survived'].groupby(train['Age_map']).count() #统计各个年龄段的人数

将价格进行标准化,并将数据组合在一起,进行onehot编码。onehot是一种特殊的编码形式,如果是只与类别有关,而与大小无关的数据适合用onehot编码,例如男女,或者第一类第二类,但是人数这种和数字大小有关的数据就用数字即可。

 #train.Fare是行数据,reshape将行数据转化为列数据在进行标准化
 scaler=preprocessing.StandardScaler().fit(train.Fare.values.reshape(-1,1))
 #通过StandardScaler将train数据和test数据同时进行同样的标准化
 train.Fare=scaler.transform(train.Fare.values.reshape(-1,1))
 test.Fare=scaler.transform(test.Fare.values.reshape(-1,1))
 train_x=pd.concat([train[['SibSp','Parch','Fare']],pd.get_dummies(train[['Pclass','Sex','Cabin','Age_map','Embarked']])],axis=1)
 train_y=train.Survived
 test_x=pd.concat([train[['SibSp','Parch','Fare']],pd.get_dummies(train[['Pclass','Sex','Cabin','Age_map','Embarked']])],axis=1)#使用get_dummies进行one hot编码

关于Plotting Learning Curves的官方用法点击打开链接

关于grid_search.GridSearchCV的官方用法点击打开链接

Plotting Learning Curves主要是画张图用来判断是否过拟合和欠拟合。过拟合现象主要是由于高方差造成的,而欠拟合现象是由于高偏差造成的。高方差的解决方法是使用更多的样本,或者更少的特征,而高偏差的解决方法是使用更多的特征,或者改变一些特征。

grid_search.GridSearchCV主要是用做对于模型求解最优参数的一个方法。

def plot_learning_curve(clf, title, x, y, ylim=None, cv=None, n_jobs=1,train_sizes=np.linspace(.05, 1., 5)):
    train_sizes, train_scores, test_scores = learning_curve(clf, x, y,train_sizes=train_sizes)
    # 输入:
    # (estimator: 分类器。
    # title: 表格的标题。
    # X: 输入的feature,numpy类型
    # y: 输入的target
    # vector
    # ylim: tuple格式的(ymin, ymax), 设定图像中纵坐标的最低点和最高点
    # cv: 做cross - validation的时候,数据分成的份数,其中一份作为cv集,其余n - 1份作为training(默认为3份)
    # n_jobs: 并行的的任务数(默认1))
    # 输出:(train_sizes_abs:训练样本数
    # train_scores:训练集上准确率
    # test_scores:交叉验证集上的准确率)
    train_scores_mean = np.mean(train_scores, axis=1)     #计算训练数据,测试数据的平均数,标准差
    train_scores_std = np.std(train_scores, axis=1)
    test_scores_mean = np.mean(test_scores, axis=1)
    test_scores_std = np.std(test_scores, axis=1)
    plt.figure().add_subplot(111)
    plt.title(title)
    if ylim is not None:       #调整图像中y值的最高点
        plt.ylim(*ylim)
    plt.xlabel("train_num_of_samples")
    plt.ylabel("score")
    plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std,
                    alpha=0.1, color="b")                   #画出曲线的边界沿线
    plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std,
                    alpha=0.1, color="r")
    plt.plot(train_sizes, train_scores_mean, 'o-', color="b", label="train score")
    plt.plot(train_sizes, test_scores_mean, 'o-', color="r", label="testCV score")
    plt.legend(loc="best")
    plt.grid()
    plt.show()
    return plt

param={'penalty':['l1','l2'],'C':[0.1,0.5,1.0,5.0]}
#penalty代表惩罚项的方法,l1正则化和l2正则化,L1正则化是指权值向量ww中各个元素的绝对值之和,L2正则化是指权值向量ww中各个元素的平方和然后再求平方根
#C中的数值表示正则化强度,值越大正则化反而越小
grd=GridSearchCV(estimator=LogisticRegression(),param_grid=param,cv=5,n_jobs=1)
#cv代表k折交叉验证,n_jobs代表并行运算
grd.fit(train_x,train_y)
plot_learning_curve(grd, 'learning_rate', train_x, train_y)
gender_submission = pd.DataFrame({'PassengerId':test.iloc[:,0],'Survived':grd.predict(test_x)})
gender_submission.to_csv('C:/kaggle/Titanic/gender_submission.csv', index=None)

最后将excel提交到kaggle上就可以啦~

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值