数据预处理说明(操作分析)

王 茂南 2019年4月27日07:30:05
评论
5276字阅读17分35秒
摘要这一篇会记录一下数据预处理的方式,即将离散的值进行one-hot编码,同时最后输出为X_train, Y_train, X_test, Y_test这四个文件。

简介

这一篇会介绍数据预处理的方式,即进行如下的操作:

  • 对于离散的数据 : 使用one-hot表示;
  • 对于连续的数据 : 则不进行改变;
  • 最后输出为X_train, Y_train, X_test, Y_test这四个文件;

数据处理

数据读取

这一步,我们导入数据,同时记录train和test数据的长度。

  1. # read raw data
  2. dfDataTrain = pd.read_csv("./data/train.csv")
  3. dfDataTest = pd.read_csv("./data/test.csv")
  4. # show Training Size and Testing Size
  5. intTrainSize = len(dfDataTrain)
  6. intTestSize = len(dfDataTest)

数据的样式大致如下(好像压缩了有点不清楚了,不过没事),就是数据中包含离散的数据。

数据预处理说明(操作分析)

处理labels标签

因为是做分类任务,原始的label是使用文字来描述的,我们先将其变为0或是1.

  1. # processing Training Label (Y)
  2. dfDataTrainY = dfDataTrain["income"]
  3. dfTrainY = pd.DataFrame((dfDataTrainY==" >50K").astype("int64"), columns=["income"]) # >50K 1, =<50K 0

处理之前的样子:

数据预处理说明(操作分析)

处理之后的样子

数据预处理说明(操作分析)

我们需要将income这一列在训练集中去除;

  1. dfDataTrain = dfDataTrain.drop(["income"], axis=1)

离散数据one-hot编码

  1. # 训练集和测试集的数据合并
  2. dfAllData = pd.concat([dfDataTrain, dfDataTest], axis=0, ignore_index=True)
  3. # 找出离散变量
  4. listObjectColumnName = [col for col in dfAllDataX.columns if dfAllDataX[col].dtypes=="object"] # 找到连续值得变量
  5. listNonObjectColumnName = [col for col in dfAllDataX.columns if dfAllDataX[col].dtypes!="object"] # 找到离散值得变量
数据预处理说明(操作分析)

接着我们重构数据集即可,即将连续变量放在前面,离散的使用one-hot编码后接在后面。

  1. # 连续变量
  2. dfNonObjectData = dfAllDataX[listNonObjectColumnName]
  3. # 离散变量
  4. dfObjectData = dfAllDataX[listObjectColumnName]
  5. dfObjectData = pd.get_dummies(dfObjectData) # 对离散变量使用one-hot编码
  6. # 合并连续变量与离散变量
  7. dfAllDataX = dfNonObjectData.join(dfObjectData)

最后的dfAllDataX就是最后需要的。

离散数据转为标号

上面是介绍了离散数据如何转换为one-hot的编码,有的时候我们不需要转为one-hot,只需要转为标号就可以了,于是我们可以使用下面的方式进行转换。

  1. dfObjectData = dfDataX[listObjectColumnName] # 这个是离散变量的值
  2. dfObjectData = dfObjectData.astype('category') # 对离散变量变成编号
  3. for i in dfObjectData.columns:
  4.     dfObjectData[i] = dfObjectData[i].cat.codes
  5. dfDataX = dfNonObjectData.join(dfObjectData) # 合并

总体的思路是和上面转one-hot的方式是一样的,也是先把离散变量拆出来,不过上面是转为one-hot,这里是转为标号,接着把数据合并即可。

 训练集,测试机分割与数据保存

  1. # 切分训练集和预测集
  2. dfTrainX = dfAllDataX[0:intTrainSize]
  3. dfTestX = dfAllDataX[intTrainSize:(intTrainSize + intTestSize)]
  4. # 数据的保存
  5. dfTrainX.to_csv("./ProcessData/X_train_my.csv", index=False)
  6. dfTestX.to_csv("./ProcessData/X_test_my.csv", index=False)
  7. dfTrainY.to_csv("./ProcessData/Y_train_my.csv", index=False)
  8. dfTestY.to_csv("./ProcessData/Y_test_my.csv", index=False)

总体代码

下面是KDD99预处理的代码,放一个总体的代码在这里,方便查看。

  1. # KDD99数据得预处理
  2. # - discrete(离散)变量使用one-hot表示
  3. # - continuous(连续)变量仍然保留
  4. import csvos
  5. import numpy as np
  6. import pandas as pd
  7. COL_NAMES = ["duration", "protocol_type", "service", "flag", "src_bytes",
  8.              "dst_bytes", "land", "wrong_fragment", "urgent", "hot", "num_failed_logins",
  9.              "logged_in", "num_compromised", "root_shell", "su_attempted", "num_root",
  10.              "num_file_creations", "num_shells", "num_access_files", "num_outbound_cmds",
  11.              "is_host_login", "is_guest_login", "count", "srv_count", "serror_rate",
  12.              "srv_serror_rate", "rerror_rate", "srv_rerror_rate", "same_srv_rate",
  13.              "diff_srv_rate", "srv_diff_host_rate", "dst_host_count", "dst_host_srv_count",
  14.              "dst_host_same_srv_rate", "dst_host_diff_srv_rate", "dst_host_same_src_port_rate",
  15.              "dst_host_srv_diff_host_rate", "dst_host_serror_rate", "dst_host_srv_serror_rate",
  16.              "dst_host_rerror_rate", "dst_host_srv_rerror_rate", "labels"] # 共42个维度
  17. def makeDataProcessing(dfData):
  18.     dfDataX = dfData
  19.     listObjectColumnName = [col for col in dfDataX.columns if dfDataX[col].dtypes=="object"]
  20.     print("离散变量名称:{}".format(listObjectColumnName))
  21.     listNonObjectColumnName = [col for col in dfDataX.columns if dfDataX[col].dtypes!="object"]
  22.     print("连续变量名称:{}".format(listNonObjectColumnName))
  23.     dfNonObjectData = dfDataX[listNonObjectColumnName] # 这个是连续变量的值
  24.     dfObjectData = dfDataX[listObjectColumnName] # 这个是离散变量的值
  25.     dfObjectData = pd.get_dummies(dfObjectData) # 对离散变量做one-hot编码
  26.     dfDataX = dfNonObjectData.join(dfObjectData) # 合并
  27.     # dfDataX = dfDataX.astype("int64")
  28.     return dfDataX
  29. if __name__ == "__main__":
  30.     # the filename
  31.     Trainfilepath = './NSL-KDD/KDDTrain+_20Percent.txt'
  32.     Testfilepath = './NSL-KDD/KDDTest-21.txt'
  33.     # read raw data
  34.     dfDataTrain = pd.read_csv(Trainfilepath, names=COL_NAMES, index_col=False)
  35.     dfDataTest = pd.read_csv(Testfilepath, names=COL_NAMES, index_col=False)
  36.     # show Training Size and Testing Size
  37.     intTrainSize = len(dfDataTrain)
  38.     intTestSize = len(dfDataTest)
  39.     # processing Training Label (Y)
  40.     dfDataTrainY = dfDataTrain["labels"]
  41.     dfDataTestY = dfDataTest["labels"]
  42.     dfTrainY = pd.DataFrame((dfDataTrainY=="normal").astype("int64"), columns=["labels"]) # normal 1, anomaly 0
  43.     dfTestY = pd.DataFrame((dfDataTestY=="normal").astype("int64"), columns=["labels"]) # normal 1, anomaly 0
  44.     # processing Training and Testing data (X)=>对离散的变量做one-hot
  45.     dfDataTrain = dfDataTrain.drop(["labels"], axis=1)
  46.     dfDataTest = dfDataTest.drop(["labels"], axis=1)
  47.     dfAllData = pd.concat([dfDataTrain, dfDataTest], axis=0, ignore_index=True)
  48.     dfAllData = makeDataProcessing(dfData=dfAllData)
  49.     # sperate All data to Training and Testing
  50.     dfTrainX = dfAllData[0:intTrainSize]
  51.     dfTestX = dfAllData[intTrainSize:(intTrainSize + intTestSize)]
  52.     # save Training data, Testing data and Training label
  53.     dfTrainX.to_csv("./ProcessData/X_train_my.csv", index=False)
  54.     dfTestX.to_csv("./ProcessData/X_test_my.csv", index=False)
  55.     dfTrainY.to_csv("./ProcessData/Y_train_my.csv", index=False)
  56.     dfTestY.to_csv("./ProcessData/Y_test_my.csv", index=False)

参考资料

数据预处理说明(操作分析)

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2019年4月27日07:30:05
  • 转载请务必保留本文链接:https://mathpretty.com/10346.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: