首页 > 解决方案 > 如何对标称属性进行一次热编码以输出为完整的二进制文件?

问题描述

我正在尝试运行一个 UNIX 脚本,将我的数据库拆分为训练、测试和验证拆分。我遇到的主要问题是我试图对我的标称属性进行热编码,以便在运行脚本时它们都是二进制代码。

输入:

@attribute age numeric
@attribute sex {female,male}
@attribute cp {typ_angina,asympt,non_anginal,atyp_angina}
@attribute trestbps numeric
@attribute chol numeric
@attribute fbs {t,f}
@attribute restecg {left_vent_hyper,normal,st_t_wave_abnormality}
@attribute thalach numeric
@attribute exang {no,yes}
@attribute oldpeak numeric
@attribute slope {up,flat,down}
@attribute ca numeric
@attribute thal {fixed_defect,normal,reversable_defect}
@attribute num {<50,>50_1,>50_2,>50_3,>50_4}

这是我一直在尝试的:

tail -n +19 ~file_location |\
   fgrep -v "%" | shuf | 
   sed -e"s/,/ /g" > temp1.txt
    # The training file
    /bin/echo "SNNS pattern definition file V3.2"  >heart-v-train.pat
    /bin/echo "generated at Mon Apr 25 15:58:23 1994"  >>heart-v-train.pat
    /bin/echo ""  >>heart-v-train.pat
    /bin/echo ""  >>heart-v-train.pat
    /bin/echo "No. of patterns : 364"  >>heart-v-train.pat
    /bin/echo "No. of input units : 25"  >>heart-v-train.pat
    /bin/echo "No. of output units : 2"  >>heart-v-train.pat
           head -$TRAIN temp1.txt |
           sed -e"s/f/1 0/g" |
           sed -e"s/m/0 1/g" |
           
           sed -e"s/typ_angina/1 0 0 0/g" |
           sed -e"s/asympt/0 1 0 0/g" |
           sed -e"s/non_aginal/0 0 1 0/g" |
           sed -e"s/atyp_angina/0 0 0 1/g" |
           
           sed -e"s/t/1 0/g" |
           sed -e"s/f/0 1/g" |
           
           sed -e"s/left_vent_hyper/1 0 0/g" |
           sed -e"s/normal/0 1 0/g" |
           sed -e"s/st_t_wave_abnormality/0 0 1/g" |
           
           sed -e"s/no/1 0/g" |
           sed -e"s/yes/0 1/g" |
           
           sed -e"s/up/1 0 0/g" |
           sed -e"s/flat/0 1 0/g" |
           sed -e"s/down/0 0 1/g" |
           
           sed -e"s/fixed_defect/1 0 0/g" |
           sed -e"s/normal/0 1 0/g" |
           sed -e"s/reversable_defect/0 0 1/g" |
           
           sed -e"s/<50/1 0/g" |
           sed -e"s/>50_1/0 1/g" >>heart-v-train.pat

我的输出变为:

    0.416667 1 0e0 1ale asy0 1p1 0 0.339623 0.326484 1 0 1 0r0 1al 0.70229 1 0 0 1 0 0 0 1 0r0 1al 1 0
0.208333 1 0e0 1ale 1 0n_anginal 0.415094 0.214612 1 0 1 0r0 1al 0.618321 1 0 0 1 0la1 0 0 1 0r0 1al 1 0
0.75 1 0e0 1ale asy0 1p1 0 0.528302 0.226027 1 0 le1 01 0_ven1

有些单词的字母会被转换,但有些则不会。我的知识是子类的每个属性数量决定了我们如何热编码,例如属性中的 4 个值将是 0 0 0 1 、 0 0 1 0 等。

任何帮助都会很棒,谢谢。

标签: databaseunixscriptingshone-hot-encoding

解决方案


推荐阅读