作业二 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)