李宏毅教授机器学习hw2用神经网络代码实现的解读

作业二 incoming prediction

任务:二分类问题

决定一个人的年收入是否达到50K

Result

Probabilstic Generative Model

在这个模型里面假设数据集属于高斯分布,采用两个种类shared_sigma的模型

训练数据直接将其中的10%当作valid,最后valid accuracy为0.843366, test accuracy为0.843867,结果还是很不错的

Logistic Regression

实验过程中采取过Ada但是效果不如sgd,使用mini-batch加快速率,batch-size为32,一共进行300epoch,最终结果随着epoch-time的增多,loss不断减小,最后valid accuracy为0.852858, test accuracy为0.852343,优于Probability Generative Model这是因为这个模型下不需要假设采样数据的分布

Neural Network

使用keras三层的fully-connected neural network,使用的loss是binary_crossentropy,activation=‘sigmoid’,optimizer=‘adam’,前两层都是600个units,batch-size=32, epoch-times=50
最后在valid set上的acc=0.9084, test-set上的acc为0.8426


```python

import pandas as pd		#
import numpy as np		#引入数据处理库
from keras.models import Sequential		#引入序列模型sequential
from keras.layers import  Dense			#
from random import shuffle			#随机生成库
from numpy.linalg import inv		#逆矩阵
import matplotlib.pyplot as plt		#引入图形可视化库
from math import floor, log		#引入数学计算库
import os		#引入文件操作库

output_dir = "output/"		#字符串赋值

def dataProcess_X(rawData):		#原始数据的处理函数

    #sex 只有两个属性 先drop之后处理
    if "income" in rawData.columns:		#如果income在rawdata的某一列中
        #将原始数据sex和income这两行删除并将数据赋给变量Data
        Data = rawData.drop(["sex", 'income'], axis=1)		
    else:
        #将原始数据的sex列删除赋给Data
        Data = rawData.drop(["sex"], axis=1)
     
    #Data的列中数据为非数字(object)的,则将列头读取到listObjectColumn中
    listObjectColumn = [col for col in Data.columns if Data[col].dtypes == "object"] #读取非数字的column
    #读取data数据中为数字的列头读取到ListNonObjectColumn中
    listNonObjedtColumn = [x for x in list(Data) if x not in listObjectColumn] #数字的column

    #将Data中离散列赋给ObjectData
    ObjectData = Data[listObjectColumn]
    #将Data中连续列赋给NonObjectData
    NonObjectData = Data[listNonObjedtColumn]
    
    问题2
    #insert set into nonobject data with male = 0 and female = 1
    #向NonObjectData中的第0列插入sex这一列的数据,如果原始数据中的sex == female,输出1
    NonObjectData.insert(0 ,"sex", (rawData["sex"] == " Female").astype(np.int))
    #set every element in object rows as an attribute
    ObjectData = pd.get_dummies(ObjectData)
	
    #左右合并数据
    Data = pd.concat([NonObjectData, ObjectData], axis=1)
    问题3
    Data_x = Data.astype("int64")	#将Data_x的类型转换为Data的类型
    # Data_y = (rawData["income"] == " <=50K").astype(np.int)

    #normalize标准化
    Data_x = (Data_x - Data_x.mean()) / Data_x.std()
	#返回
    return Data_x

def dataProcess_Y(rawData):
    #将原始数据income这一列赋给df_y
    df_y = rawData['income']
    #将Data_y转换成表格型数据 ,注意' >50K'处有一个空格
    Data_y = pd.DataFrame((df_y==' >50K').astype("int64"), columns=["income"])
    return Data_y

if __name__ == "__main__":
    trainData = pd.read_csv("data/train.csv")
    testData = pd.read_csv("data/test.csv")
    ans = pd.read_csv("data/correct_answer.csv")

    # here is one more attribute in trainData
    #将traindata数据丢掉国家为Holand Netherland的数据
    x_train = dataProcess_X(trainData).drop(['native_country_ Holand-Netherlands'], axis=1).values
    x_test = dataProcess_X(testData).values
    y_train = dataProcess_Y(trainData).values
    y_ans = ans['label'].values		#得到ans中label列的数据给到y_ans

    #搭建神经网络模型
    model = Sequential()

    问题4  怎么判断数据中有多少个feature特征
    model.add(Dense(units=600, activation='sigmoid', input_dim = 106))
    model.add(Dense(units=600, activation='sigmoid'))
    model.add(Dense(units=1, activation='sigmoid'))

    #模型训练模式 loss-目标函数  
    #			optimizer-优化器  
    #			metrics-测试时的性能指标 一般用accuracy
    model.compile(loss='binary_crossentropy',
                  optimizer='adam',
                  metrics=['accuracy'])
	#训练模型参数+训练
    #xtrain-输入数据。如果模型只有一个输入,那么x的类型是numpy 
#array,如果模型有多个输入,那么x的类型应当为list,list的元素是对应于各个输入的numpy array
	#标签,numpy array
    #batch_size:整数,指定进行梯度下降时每个batch包含的样本数。训练时一个batch的样本会被计算一次梯度下降,使目标函数优化一步。
    #epochs:整数,训练的轮数,每个epoch会把训练集轮一遍。
    model.fit(x_train, y_train, batch_size=32, epochs=50)
    
    #模型评估 返回一个测量误差的标量值
    #x:输入数据,与fit一样,是numpy array或numpy array的list
    #y:标签,numpy array
    score = model.evaluate(x_test, y_ans)
    
    #predict模型评估,返回预测值
    #queeze函数:从数组的形状中删除单维度条目,即把shape中为1的维度去掉
    #
    result = np.squeeze(model.predict(x_test))
    
    print('Total loss on Testing set: ', score[0])
    print('Accuracy of Testing set: ', score[1])


    model.save(os.path.join(output_dir+'nn_model.h5'))

    #将result结果四舍五入默认为整数,并改变result中所有数据类型为int
    y_ = np.around(result).astype(np.int)
    
    df = pd.DataFrame({"id": np.arange(1, 16282), "label": y_})
    
    result = (np.squeeze(y_ans) == y_)
    
    print('Test acc = %f' % (float(result.sum()) / result.shape[0]))
    df = pd.DataFrame({"id": np.arange(1, 16282), "label": y_})
    #如果路径output_dir存在
    if not os.path.exists(output_dir):
        os.mkdir(output_dir)	#创建路径下的
    df.to_csv(os.path.join(output_dir + 'nn_output.csv'), sep='\t', index=False)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值