tensorflow实现逻辑回归,在kaggle《泰坦尼克》训练并测试准确率

tensorflow实现逻辑回归,在kaggle《泰坦尼克》训练并测试准确率

主要有以下3个步骤:

  • 1 数据集特征分析、预处理
  • 2 基于tensorflow的逻辑回归
  • 3 训练、准确率测试

1 数据集特征分析、预处理

首先看下数据集的特征

  • 分析可得到以下数据特征信息:

    1. 训练数据中总共有891名乘客,但有些属性的数据不全,比如:
      -Age(年龄)属性只有714名乘客有记录
      -Cabin(客舱)只有204名乘客是已知的
    2. 有些属性为类目属性
      比如:Sex(男、女),需要将其转化为数值型特征
    3. 有些属性为无关属性/特征
      如:PassengerId 与是否获救无关,需删掉
    4. 数值型特征的scale不同,需要进行归一化处理
  • 据此,需要进行以下数据预处理操作:

    1. 属性值缺失处理:
      -可采用RandomForestClassifier,根据已有数据,填补缺失的年龄属性
      -Cabin特征缺失值太多,填补的数据可能不准确,考虑直接删掉
    2. 类目属性转化为数值型特征
      如:Sex属性中,“男”用“1”表示,“女”用“0”表示。
    3. 删除无关属性/特征
      删除特征:PassengerId、Name
      (这里我把Ticket特征也删掉了,原因是:Ticket类型太多,暂时难以看出和是否获救的相关性,暂时先放一放)
    4. 属性特征值归一化

2 基于tensorflow的逻辑回归

  • Logistic Regression
    利用sigmoid函数,对于样本

    X=(x1,x2...,xn)T
    可以将二分类的函数写成
    hθ(x)=λ(θ0+θ1x1+θ2x2,...,θnxn)

    其中, θ=(θ0,θ1,...,θn)T 为待学习的参数,该公式即我们熟悉的
    y=Wx+b

    求解参数 θ 的步骤是:

    1. 先确定一个形如下式的整体损失函数
      J(θ)=1mi=1mcost(xi,yi)

      需注意:在实际应用中,单个样本的损失函数 cost(xi,yi) 常取对数似然函数,即
      cost(xi,yi)=y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))
    2. 通过学习样本的特征,对参数 θ 进行迭代优化,找到损失函数最小时对应的一组 θ

    因此,在本问题中,设置tensorflow训练时的损失函数为

    J(θ)=1mi=1m[y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))]

  • 使用TensorFlow训练模型大致是这样的步骤:

    1. 设置各种参数,如:学习率,迭代次数
    2. 定义图:定义变量、模型、优化方式。如:x,y,loss function
    3. 初始化变量:init = tf.initialize_all_variables()
    4. 建立session,正式开始训练。

具体内容详见下方代码。

3 训练、准确率测试

模型训练过程如下:
这里写图片描述

得到的Loss随迭代次数变化如下:

准确率测试结果为82%

完整代码

from __future__ import print_function, division
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn
import random
from sklearn.ensemble import RandomForestRegressor
import sklearn.preprocessing as preprocessing
from numpy import array
from sklearn.model_selection import train_test_split

def set_missing_ages(data):#使用RandomForestClassifier填补缺失的年龄属性
    age_df = data[['Age','Fare', 'Parch', 'SibSp', 'Pclass']]
    known_age = age_df[age_df.Age.notnull()].as_matrix()
    unknown_age = age_df[age_df.Age.isnull()].as_matrix()
    # y --age
    y = known_age[:, 0]
    # X --feature
    X = known_age[:, 1:]
    # fit to RandomForestRegressor
    rfr = RandomForestRegressor(random_state=0, n_estimators=2000, n_jobs=-1)
    rfr.fit(X, y)

    predictedAges = rfr.predict(unknown_age[:, 1::])
    data.loc[(data.Age.isnull()), 'Age'] = predictedAges
    return data

def attribute_to_number(data):
    dummies_Pclass = pd.get_dummies(data['Pclass'], prefix='Pclass')
    dummies_Embarked = pd.get_dummies(data['Embarked'], prefix='Embarked')
    dummies_Sex = pd.get_dummies(data['Sex'], prefix='Sex')
    data = pd.concat([data, dummies_Pclass,dummies_Embarked, dummies_Sex], axis=1)
    data.drop(['Pclass','Sex', 'Embarked'], axis=1, inplace=True)
    return data


def Scales(data):
    scaler = preprocessing.StandardScaler()
    age_scale_param = scaler.fit(data['Age'].reshape(-1, 1))
    data['Age_scaled'] = scaler.fit_transform(data['Age'].reshape(-1, 1), age_scale_param)
    fare_scale_param = scaler.fit(data['Fare'].reshape(-1, 1))
    data['Fare_scaled'] = scaler.fit_transform(data['Fare'].reshape(-1, 1), fare_scale_param)
    SibSp_scale_param = scaler.fit(data['SibSp'].reshape(-1, 1))
    data['SibSp_scaled'] = scaler.fit_transform(data['SibSp'].reshape(-1, 1), SibSp_scale_param)
    Parch_scale_param = scaler.fit(data['Parch'].reshape(-1, 1))
    data['Parch_scaled'] = scaler.fit_transform(data['Parch'].reshape(-1, 1), Parch_scale_param)
    data.drop(['Parch', 'SibSp', 'Fare', 'Age'], axis=1, inplace=True)
    return data


def DataPreProcess(in_data): #数据预处理
    in_data.drop(['PassengerId','Name','Ticket','Cabin'], axis=1, inplace=True)
    data_ages_fitted = set_missing_ages(in_data) #填补缺失的年龄属性
    data = attribute_to_number(data_ages_fitted) #类目属性转化为数值型特征
    data_scaled = Scales(data) #数值归一化

    #划分特征X,和label Y
    data_copy = data_scaled.copy(deep=True) 
    data_copy.drop(
        ['Pclass_1', 'Pclass_2', 'Pclass_3', 'Embarked_C', 'Embarked_Q', 'Embarked_S', 'Sex_female', 'Sex_male',
         'Age_scaled', 'Fare_scaled', 'SibSp_scaled', 'Parch_scaled'], axis=1, inplace=True)
    data_y = np.array(data_copy)
    data_scaled.drop(['Survived'], axis=1, inplace=True)
    data_X = np.array(data_scaled)

    return data_X,data_y


def LR(data_X,data_y):#tensorflow 实现 Logistic Regression
    X_train, X_test, y_train, y_test = train_test_split(data_X,data_y, test_size=0.4, random_state=0)

    y_train = tf.concat([1 - y_train, y_train], 1)
    y_test = tf.concat([1 - y_test, y_test], 1)

    learning_rate = 0.001
    training_epochs = 50
    batch_size = 50
    display_step = 10

    n_samples = X_train.shape[0] #sample_num
    n_features = X_train.shape[1] #feature_num
    n_class = 2 

    x = tf.placeholder(tf.float32, [None, n_features])
    y = tf.placeholder(tf.float32, [None, n_class])

    W = tf.Variable(tf.zeros([n_features, n_class]),name="weight")
    b = tf.Variable(tf.zeros([n_class]),name="bias")

    # predict label
    pred = tf.matmul(x, W) + b

    # accuracy
    correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

    # cross entropy
    cost = tf.reduce_sum(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))

    optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)

    init = tf.initialize_all_variables()

    # train
    with tf.Session() as sess:
        sess.run(init)
        for epoch in range(training_epochs):
            avg_cost = 0
            total_batch = int(n_samples / batch_size)
            for i in range(total_batch):
                _, c = sess.run([optimizer, cost],
                                feed_dict={x: X_train[i * batch_size: (i + 1) * batch_size],
                                           y: y_train[i * batch_size: (i + 1) * batch_size, :].eval()})
                avg_cost = c / total_batch
            plt.plot(epoch + 1, avg_cost, 'co')

            if (epoch + 1) % display_step == 0:
                print("Epoch:", "%04d" % (epoch + 1), "cost=", avg_cost)

        print("Optimization Finished!")
        print("Testing Accuracy:", accuracy.eval({x: X_train, y: y_train.eval()}))

        plt.xlabel("Epoch")
        plt.ylabel("Cost")
        plt.show()


if __name__ == "__main__":
    data = pd.read_csv("/home/yimi/LearnTF/logistic/data/train.csv")
    data_X,data_y = DataPreProcess(data)
    LR(data_X,data_y)

参考:
[1]https://www.cnblogs.com/zhizhan/p/5238908.html
[2]http://blog.csdn.net/u010099080/article/details/53054519
[3]https://www.cnblogs.com/peghoty/p/3857839.html

逻辑回归Kaggle泰坦尼克之灾竞赛中的应用主要是用于预测乘客是否幸存。在这个竞赛中,我们可以将乘客的特征(如性别、年龄、船票等级等)作为自变量,将乘客是否幸存作为因变量,通过训练逻辑回归模型来预测新乘客的生存情况。 以下是逻辑回归Kaggle泰坦尼克之灾竞赛中的一般步骤: 1. 数据探索和预处理:首先,我们需要对数据进行探索,了解各个特征的分布情况、缺失值情况等。然后,我们可以对缺失值进行填充、对分类变量进行编码等预处理操作。 2. 特征工程:根据对数据的理解和领域知识,我们可以进行特征工程,提取新的特征或者对原有特征进行组合,以提高模型的性能。 3. 数据划分:将数据集划分为训练集和测试集,通常采用交叉验证的方法进行模型选择和调参。 4. 模型训练:使用逻辑回归算法对训练集进行拟合,并根据模型评估指标(如准确率、精确率、召回率等)选择最佳模型。 5. 模型调参:可以通过网格搜索等方法对模型的超参数进行调优,以获得更好的性能。 6. 模型评估:使用测试集对训练好的模型进行评估,得到模型在未知数据上的性能指标。 7. 预测并提交结果:使用训练好的模型对新的数据进行预测,并将结果提交到Kaggle平台上进行评估和排名。 逻辑回归是一个简单而有效的分类算法,在泰坦尼克之灾竞赛中有着广泛的应用。但是要注意,逻辑回归并不是唯一可用的算法,根据数据集的性质和特点,我们也可以尝试其他的分类算法来提高预测性能。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值