Computer >> 컴퓨터 >  >> 프로그램 작성 >> BASH 프로그래밍

Bash로 기계 학습 모델 만들기

머신 러닝은 기존 알고리즘이 어렵다고 여기는 것을 예측하거나 예측할 수 있는 강력한 컴퓨팅 기능입니다. 기계 학습 여정은 많은 데이터를 수집하고 준비하는 것으로 시작됩니다. 그런 다음 해당 데이터를 기반으로 수학적 모델을 구축합니다. 이러한 작업에 여러 도구를 사용할 수 있지만 저는 쉘을 사용하는 것을 좋아합니다.

쉘은 정의된 언어를 사용하여 작업을 수행하기 위한 인터페이스입니다. 이 언어는 대화식으로 호출하거나 스크립팅할 수 있습니다. 쉘의 개념은 1970년대 유닉스 운영 체제에 도입되었습니다. 가장 인기 있는 셸에는 Bash, tcsh 및 Zsh가 있습니다. Linux, macOS, Windows를 포함한 모든 운영체제에서 사용할 수 있어 높은 이식성을 제공합니다. 이 연습에서는 Bash를 사용하겠습니다.

이 도움말은 데이터 수집 및 데이터 준비에 셸을 사용하는 방법을 소개합니다. 효율적인 도구를 찾고 있는 데이터 과학자이든 머신 러닝에 자신의 기술을 사용하려는 셸 전문가이든 여기에서 귀중한 정보를 찾을 수 있기를 바랍니다.

이 기사의 예제 문제는 미국 주의 온도를 예측하는 기계 학습 모델을 만드는 것입니다. 셸 명령과 스크립트를 사용하여 다음 데이터 수집 및 데이터 준비 단계를 수행합니다.

  1. 데이터 다운로드
  2. 필요한 필드 추출
  3. 데이터 집계
  4. 시계열 만들기
  5. 데이터 세트 학습, 테스트 및 검증 생성

Python과 같은 기계 학습 프로그래밍 언어로 이 모든 작업을 수행할 수 있는데 왜 쉘로 이 작업을 수행해야 하는지 물을 수 있습니다. 좋은 질문입니다. 쉘과 같은 쉽고 친숙하며 풍부한 기술로 데이터 처리가 수행된다면 데이터 과학자는 언어의 세부 사항이 아닌 머신 러닝 모델링에만 집중합니다.

전제 조건

먼저 쉘 인터프리터가 설치되어 있어야 합니다. Linux 또는 macOS를 사용하는 경우 이미 설치되어 있으며 이미 익숙할 수 있습니다. Windows를 사용하는 경우 MinGW 또는 Cygwin을 사용해 보세요.

자세한 내용은 다음을 참조하십시오.

  • opensource.com의 Bash 자습서
  • Bourne shell의 창시자인 Steve Parker의 공식 셸 스크립팅 튜토리얼
  • Linux 문서 프로젝트의 초보자를 위한 Bash 가이드
  • 특정 명령에 대한 도움이 필요하면 <commandname> --help를 입력하십시오. 도움을 위해 쉘에서; 예:ls --help .

시작하기

이제 셸이 설정되었으므로 기계 학습 온도 예측 문제에 대한 데이터 준비를 시작할 수 있습니다.

1. 데이터 다운로드

이 튜토리얼의 데이터는 미국 국립해양대기청(NOAA)에서 가져온 것입니다. 지난 10년간의 데이터를 사용하여 모델을 훈련합니다. 데이터 소스는 https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/by_year/이며 데이터는 .csv 형식이며 gzip으로 압축되어 있습니다.

셸 스크립트를 사용하여 데이터를 다운로드하고 압축을 풉니다. 즐겨 사용하는 텍스트 편집기를 사용하여 download.sh라는 파일을 만듭니다. 그리고 아래 코드를 붙여넣습니다. 코드의 주석은 명령이 수행하는 작업을 설명합니다.

#!/bin/sh
# 이것을 해시뱅이라고 합니다. 이 파일을 실행하기 위해 사용된 executor를 식별합니다.
# 이 경우 스크립트는 쉘 자체에서 실행됩니다.
# 지정하지 않을 경우 스크립트를 실행할 프로그램을 지정해야 합니다.
# 해시뱅 포함:./download.sh; 해시뱅 없음:sh ./download.sh;

FROM_YEAR=2010
TO_YEAR=2019

year=$FROM_YEAR
# 모든 해 동안 FROM_YEAR=2010년부터 TO_YEAR=2019년까지
while [ $year -le $TO_YEAR ]
do
    # 지금 다운로드 중인 연도를 표시
    echo $year
# 다운로드
    wget https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/by_year/${year}.csv.gz
    # 압축 풀기
    gzip -d ${year}.csv.gz
    # 증분하여 다음 해로 이동
    year=$(($year+1))
done

참고:

  • 프록시 서버 뒤에 있는 경우 Mark Grennan의 방법을 참조하고 다음을 사용하십시오.
    export http_proxy=https://username:password@proxyhost:port/
    export https_proxy=https://username:password@proxyhost:port/
  • 모든 표준 명령이 이미 PATH에 있는지 확인합니다(예:/bin 또는 /usr/bin ). 그렇지 않은 경우 PATH를 설정하세요.
  • Wget은 명령줄에서 웹 서버에 연결하기 위한 유틸리티입니다. 시스템에 Wget이 설치되어 있지 않으면 다운로드하십시오.
  • 압축 및 압축 해제에 사용되는 유틸리티인 gzip이 있는지 확인하세요.

이 스크립트를 실행하여 10년치 데이터를 다운로드, 추출 및 CSV로 사용 가능하게 만드십시오.

$ ./download.sh
2010
--2020-10-30 19:10:47--  https://www1.ncdc.noaa.gov/pub/data/ghcn/ daily/by_year/2010.csv.gz
해결 www1.ncdc.noaa.gov (www1.ncdc.noaa.gov)... 205.167.25.171, 205.167.25.172, 205.167.25.178,... />www1.ncdc.noaa.gov에 연결 중(www1.ncdc.noaa.gov)|205.167.25.171|:443... 연결됨.
HTTP 요청 전송, 응답 대기 중... 200 OK
길이:170466817 (163M) [application/gzip]
저장할 위치:'2010.csv.gz'

     0K ....... ..... ........................... ...........  0% 69.4K 39m57s
    50K ..... ..... ........... ........... ...........  0%  202K 26m49s
   100K ........... ........... .................. ........... ....  0% 108만 18분 42초

...

ls 명령은 폴더의 내용을 나열합니다. ls 20*.csv 사용 이름이 20으로 시작하고 .csv로 끝나는 모든 파일을 나열하려면

$ ls 20*.csv
2010.csv  2011.csv  2012.csv  2013.csv  2014.csv  2015.csv  2016.csv  2017.csv 9  2018.csv

2. 평균 온도 추출

미국 지역의 CSV에서 TAVG(평균 온도) 데이터 추출:

extract_tavg_us.sh

#!/bin/sh

# 이름이 "20"으로 시작하고 ens가 ".csv"인 각 파일에 대해
`ls 20*.csv`의 csv_file에 대해
do
    # 파일 이름 $csv_file이 TAVG_US_$csv_file 파일로 추출되었다는 메시지
    # 예:2010.csv를 TAVG_US_2010.csv로 추출
    echo "$csv_file -> TAVG_US_ $csv_file"
    # grep "TAVG" $csv_file:텍스트가 "TAVG"인 파일의 추출 줄
    # |:pipe
    # grep "^US":다음으로 시작하는 추출 줄에서 text "US"
    #> TAVG_US_$csv_file:추출된 줄을 TAVG_US_$csv_file 파일에 저장
    grep "TAVG" $csv_file | grep "^US"> TAVG_US_$csv_file
완료

이 스크립트:

$ ./extract_tavg_us.sh
2010.csv -> TAVG_US_2010.csv
...
2019.csv -> TAVG_US_2019.csv

다음 파일을 생성합니다:

$ ls tavg_us*.csv
tavg_us_2010.csv tavg_us_2011.csv tavg_us_2012.csv tavg_us_2013.csv
tavg_us_2014.csv tavg_us_2015.csv tavg_us_us_2016.csup_2016. CSV

다음은 TAVG_US_2010.csv의 처음 몇 줄입니다. :

$ 헤드 TAVG_US_2010.csv
USR0000AALC,20100101,TAVG,-220,,,U,
USR0000AALP,20100101,TAVG,-9,,,U,
USR,01000AB TAVG,12,,,U,
USR0000ABCA,20100101,TAVG,16,,,U,
USR0000ABCK,20100101,TAVG,-309,,,U,
USR0000ABER,1,20100 ,-81,,,U,
USR0000ABEV,20100101,TAVG,-360,,,U,
USR0000ABEN,20100101,TAVG,-224,,,U,
USR0000ABNS1,2010 TAVG,89,,,U,
USR0000ABLA,20100101,TAVG,59,,,U,

head 명령어는 파일의 처음 몇 줄(기본적으로 10줄)을 표시하는 유틸리티입니다.

데이터에는 필요한 것보다 더 많은 정보가 있습니다. 3열(모든 데이터가 평균 온도이므로)과 5열을 제거하여 열 수를 제한합니다. 즉, 1열(기후 관측소), 2열(날짜), 4열(기온 기록)을 유지합니다.

key_columns.sh

#!/bin/sh

# 이름이 "TAVG_US_"로 시작하고 끝이 ".csv"인 각 파일에 대해
`ls TAVG_US_*.csv`의 csv_file에 대해
do
    echo "$csv_file 열 추출"
    # cat $csv_file:'cat'은 파일을 연결하는 것입니다. 여기에서 1년 csv 파일을 표시하는 데 사용됩니다.
    # |:파이프
    # cut -d',' -f1,2,4:, 구분 기호로 열 1,2,4 자르기
    #> $csv_file.cut:임시 파일에 저장
|> $csv_file.cut:
    고양이 $csv_file | cut -d',' -f1,2,4> $csv_file.cut
    # mv $csv_file.cut $csv_file:임시 파일을 원본 파일로 이름 바꾸기
    mv $csv_file.cut $csv_file
    # 파일이 처리되어 동일한 파일에 다시 저장됩니다.
    # 이 작업을 수행하는 다른 방법이 있습니다.
    # 중간 파일을 사용하는 것이 가장 안정적인 방법입니다.
완료

스크립트 실행:

$ ./key_columns.sh
TAVG_US_2010.csv 열 추출
...
TAVG_US_2019.csv 열 추출

TAVG_US_2010.csv의 처음 몇 줄 불필요한 데이터가 제거된 항목은 다음과 같습니다.

$ 헤드 TAVG_US_2010.csv
USR0000AALC,20100101,-220
USR0000AALP,20100101,-9
USR0000ABAN,20100101,1020
USR0000ABER,20100101,-81
USR0000ABEV,20100101,-360
USR0000ABEV,20100101,-360
USR0000ABEN,201002401,-2 ,20100101,59

날짜는 문자열 형식(YMD)입니다. 모델을 올바르게 학습시키려면 알고리즘이 쉼표로 구분된 Y,M,D 형식의 날짜 필드를 인식해야 합니다(예:20100101 2010,01,01이 됩니다. ). sed 유틸리티로 변환할 수 있습니다.

date_format.sh

for csv_file in `ls TAVG_*.csv`
do
    echo 날짜 형식 $csv_file
    # 다음을 삽입합니다.
    sed -i 's/,.. ../&,/' $csv_file
    # 다음 월 삽입
    sed -i 's/,....,../&,/' $csv_file
완료

스크립트 실행:

$ ./date_format.sh
날짜 형식 TAVG_US_2010.csv
...
날짜 형식 TAVG_US_2019.csv

TAVG_US_2010.csv의 처음 몇 줄 쉼표로 구분된 날짜 형식은 다음과 같습니다.

$ 헤드 TAVG_US_2010.csv
USR0000AALC,2010,01,01,-220
USR0000AALP,2010,01,01,-9
USR0000ABAN2,2010,01,01,1 br />USR0000ABCA,2010,01,01,16
USR0000ABCK,2010,01,01,-309
USR0000ABER,2010,01,01,-81
USR0000ABEV,201 01,-360
USR0000ABEN,2010,01,01,-224
USR0000ABNS,2010,01,01,89
USR0000ABLA,2010,01,01,59

3. 주 평균 기온 데이터 집계

날씨 데이터는 미국 도시에 있는 기후 관측소에서 가져오지만 전체 주의 온도를 예측하려고 합니다. 기후 관측소 데이터를 주 데이터로 변환하려면 먼저 기후 관측소를 해당 주에 매핑합니다.

wget을 사용하여 기후 관측소 목록 다운로드:

$ wget ftp://ftp.ncdc.noaa.gov/pub/data/ghcn/daily/ghcnd-stations.txt 

미국 목록을 찾으려면 grep 유틸리티로 미국 방송국을 추출하십시오. 다음 명령은 "US 텍스트로 시작하는 줄을 검색합니다. ." > 출력을 파일(이 경우 us_stations.txt)에 쓰는 리디렉션입니다. :

$ grep "^US" ghcnd-stations.txt > us_stations.txt 

이 파일은 예쁜 인쇄용으로 만들어졌으므로 열 구분 기호가 일치하지 않습니다.

$ head us_stations.txt
US009052008 43.7333 -96.6333 482.0 SD SIOUX FALLS (Environ. Canada)
US10RMHS145 40.5268 -105.1113 1569.1 CO RMHS 1.6 SSW /> US10ADAM001 40.5680 -905050.50.5680.50. ㅅ
...

cat을 사용하여 파일을 인쇄하고, tr을 사용하여 반복을 압축하고 임시 파일로 출력하고, 임시 파일의 이름을 다시 원래대로 변경하여 일관성을 유지하십시오. 이 모든 것이 한 줄에 있습니다.

$ cat us_stations.txt | tr -s ' ' > us_stations.txt.tmp; cp us_stations.txt.tmp us_stations.txt; 

명령 출력의 첫 번째 줄:

$ head us_stations.txt
US009052008 43.7333 -96.6333 482.0 SD SIOUX FALLS (Environ. Canada)
US10RMHS145 40.5268 -105.1113 1569.1 CO RMHS 1.6 SSW /> US10ADAM001 40.5680 -905050.50.5680.50. ㅅ
...

여기에는 GPS 좌표 등의 많은 정보가 포함되어 있지만 스테이션 코드와 상태만 있으면 됩니다. 컷 사용:

$ cut -d' ' -f1,5 us_stations.txt > us_stations.txt.tmp; mv us_stations.txt.tmp us_stations.txt; 

명령 출력의 첫 번째 줄:

$ head us_stations.txt
US009052008 SD
US10RMHS145 CO
US10adam001 NE
US10adam002 NE
...

이것을 CSV로 만들고 sed를 사용하여 공백을 쉼표 구분 기호로 변경하십시오.

$ sed -i s/' '/,/g us_stations.txt 

명령 출력의 첫 번째 줄:

$ head us_stations.txt
US009052008,SD
US10RMHS145,CO
US10adam001,NE
US10adam002,NE
...

이러한 작업에 여러 명령을 사용했지만 한 번의 실행으로 모든 단계를 수행할 수 있습니다. 직접 사용해 보세요.

이제 대용량 데이터 처리에 기능적으로 고성능인 AWK를 사용하여 스테이션 코드를 상태 위치로 교체하십시오.

station_to_state_data.sh

#!/bin/sh

`ls TAVG_US_*.csv`의 DATA_FILE

do
    echo ${DATA_FILE}
    awk -v 파일=$DATA_FILE -F, '
        {
            state_day_sum[$1 "," $2 "," $3 "," $4] =state_day_sum[$1 "," $2 "," $3 "," $4] + $5
            state_day_num[$1 "," $2 "," $3 "," $4] =state_day_num[$1 "," $2 "," $3 "," $4] + 1
        }
        END {
          for (state_day_key in state_day_sum) {
               > ' state_day_key "," state_day_sum[state_day_key]/state_day_num[state_day key]  , $DATA_FILE> STATE_DAY_${DATA_FILE}.tmp
    sort -k1 -k2 -k3 -k4 STATE_DAY_$DATA_FILE
    rm -f STATE_DAY_${DATA_FILE}.tmp
완료

이 매개변수의 의미는 다음과 같습니다.

-F, 필드 구분자는 ,입니다.
FNR 각 파일의 줄 번호
NR 두 파일의 줄 번호를 함께
FNR==NR 첫 번째 파일 ${PATTERN_FILE}에서만 TRUE입니다.
{ x[$1]=$2; next; } FNR==NR인 경우 TRUE입니다($PATTERN_FILE의 모든 줄에 대해). 만)
- x station=state를 저장할 변수 지도
- x[$1]=$2 station=state의 데이터 추가 지도
- $1 첫 번째 파일의 첫 번째 열(역 코드)
- $2 첫 번째 파일의 두 번째 열(주 코드)
- x 모든 역의 지도, 예:x[US009052008]=SD , x[US10RMHS145]=CO , ..., x[USW00096409]=AK
- next FNR==NR과 일치하는 다음 줄로 이동 (본질적으로 이것은 ${PATTERN_FILE}에서 모든 스테이션 상태의 맵을 생성합니다.
{ $1=x[$1]; print $0 } FNR==NR인 경우 FALSE입니다(in $DATA_FILE의 모든 줄에 대해 만)
- $1=x[$1] 첫 번째 필드를 x[$1]로 교체; 기본적으로 스테이션 코드를 상태 코드로 교체
- print $0 모든 열 인쇄(대체된 $1 포함) )
OFS=, 출력 필드 구분 기호는 ,입니다.

역 코드가 포함된 CSV:

$ 헤드 TAVG_US_2010.csv
USR0000AALC,2010,01,01,-220
USR0000AALP,2010,01,01,-9
USR0000ABAN2,2010,01,01,1 br />USR0000ABCA,2010,01,01,16
USR0000ABCK,2010,01,01,-309
USR0000ABER,2010,01,01,-81
USR0000ABEV,201 01,-360
USR0000ABEN,2010,01,01,-224
USR0000ABNS,2010,01,01,89
USR0000ABLA,2010,01,01,59

다음 명령을 실행하십시오.

$ ./station_to_state_data.sh
TAVG_US_2010.csv
...
TAVG_US_2019.csv

스테이션은 이제 상태에 매핑됩니다:

$ 헤드 TAVG_US_2010.csv
AK,2010,01,01,-220
AZ,2010,01,01,-9
AL,2010,01,01,12
AK,2010,01,01,16
AK,2010,01,01,-309
AK,2010,01,01,-81
AK,2010,01, 01,-360
AK,2010,01,01,-224
AZ,2010,01,01,59
AK,2010,01,01,-68

모든 주에는 하루에 몇 가지 온도 측정값이 있으므로 각 주의 하루 평균 측정값을 계산해야 합니다. 텍스트 처리에는 AWK를 사용하고, 최종 결과가 논리적 순서로 정렬되도록 정렬하고, 처리 후 임시 파일을 삭제하려면 rm을 사용합니다.

station_to_state_data.sh

PATTERN_FILE=us_stations.txt

`ls TAVG_US_*.csv`의 DATA_FILE용
do
    echo ${DATA_FILE}

    awk - F, \
        'FNR==NR { x[$1]=$2; 다음; } { $1=x[$1]; 인쇄 $0 }' \
        OFS=, \
        ${PATTERN_FILE} ${DATA_FILE}> ${DATA_FILE}.tmp

   mv ${DATA_FILE}.tmp ${DATA_FILE }
완료

AWK 매개변수의 의미는 다음과 같습니다.

FILE=$DATA_FILE FILE로 처리된 CSV 파일
-F, 필드 구분 기호는 ,입니다.
state_day_sum[$1 "," $2 "," $3 "," $4] = $5

state_day_sum[$1 "," $2 "," $3 "," $4] + $5
온도 합계($5 ) 상태 ($1 ) 연도($2) ), 월($3 ), 일($4 )
state_day_num[$1 "," $2 "," $3 "," $4] = $5

state_day_num[$1 "," $2 "," $3 "," $4] + 1
주의 온도 판독값 수($1) ) 연도($2) ), 월($3 ), 일($4 )
END 결국, 모든 주, 년, 월, 일에 대한 판독값의 합계 및 수를 수집한 후 평균을 계산합니다.
for (state_day_key in state_day_sum) 각 주-년-월-일
print state_day_key "," state_day_sum[state_day_key]/state_day_num[state_day_key] 인쇄 인쇄 상태, 연도, 월, 일, 평균
OFS=, 출력 필드 구분 기호는 ,입니다.
in $DATA_FILE 입력 파일(이름이 TAVG_US_로 시작하는 모든 파일 .csv로 끝남 , 하나씩)
> STATE_DAY_${DATA_FILE}.tmp 결과를 임시 파일에 저장

스크립트 실행:

$ ./TAVG_avg.sh
TAVG_US_2010.csv
TAVG_US_2011.csv
TAVG_US_2012.csv
TAVG_US_2013.csv
TAVG_US_2014 csv
TAVG_US_2016.csv
TAVG_US_2017.csv
TAVG_US_2018.csv
TAVG_US_2019.csv

다음 파일이 생성됩니다.

$ ls STATE_DAY_TAVG_US_20*.csv
STATE_DAY_TAVG_US_2010.csv  STATE_DAY_TAVG_US_2015.csv
STATE_DAY_TAVG_US_2011.csv  STATE_DAY_TAVG_US_2016.csv
STATE_DAY_TAVG_US_2012.csv  STATE_DAY_TAVG_US_2017.csv
STATE_DAY_TAVG_US_2013.csv  STATE_DAY_TAVG_US_2018.csv
STATE_DAY_TAVG_US_2014.csv  STATE_DAY_TAVG_US_2019.csv

모든 주에 대한 1년 데이터 보기(한 번에 한 페이지씩 출력을 보는 유틸리티는 더 적음):

$ 감소 STATE_DAY_TAVG_US_2010.csv
AK,2010,01,01,-181.934
...
AK,2010,01,31,-101.068
AK,2010 ,02,01,-107.11
...
AK,2010,02,28,-138.834
...
WY,2010,01,01,-43.5625
...
WY,2010,12,31,-215.583

모든 데이터 파일을 하나로 병합:

$ cat STATE_DAY_TAVG_US_20*.csv > TAVG_US_2010-2019.csv 

이제 모든 연도에 대한 모든 상태가 포함된 하나의 파일이 있습니다.

$ 고양이 TAVG_US_2010-2019.csv
AK,2010,01,01,-181.934
...
WY,2018,12,31,-167.421
AK ,2019,01,01,-32.3386
...
WY,2019,12,30,-131.028
WY,2019,12,31,-79.8704

4. 시계열 데이터 만들기

이와 같은 문제는 순환 신경망(RNN)인 장단기 기억(LSTM)과 같은 시계열 모델로 적절하게 해결됩니다. 이 입력 데이터는 시간 조각으로 구성됩니다. 20일을 한 조각으로 간주하십시오.

이것은 일회성 조각입니다(STATE_DAY_TAVG_US_2010.csv). ):

X(입력 – 20주):
AK,2010,01,01,-181.934
AK,2010,01,02,-199.531
...
AK,2010,01,20,-157.273

y(21번째 주, 이 20주 동안의 예측):
AK,2010,01,21,-165.31

이 시간 조각은 다음과 같이 표시됩니다(처음 20주가 X이고 21주가 y인 온도 값).

AK, -181.934,-199.531, ...,
-157.273,-165.3

슬라이스는 시간 연속적입니다. 예를 들어 2010년 말은 2011년까지 계속됩니다.

AK,2010,12,22,-209.92
...
AK,2010,12,31,-79.8523
AK,2011,01,01,-59.5658
...
AK,2011,01,10,-100.623

예측 결과: 

AK,2011,01,11,-106.851 

이 시간 조각은 다음과 같습니다.

AK, -209.92, ... ,-79.8523,-59.5658, ... ,-100.623,-106.851 

모든 주, 연도, 월 및 날짜에 대해 등등. 자세한 설명은 시계열 예측에 대한 이 자습서를 참조하세요.

타임 슬라이스를 생성하는 스크립트 작성:

timeslices.sh

#!/bin/sh

TIME_SLICE_PERIOD=20

file=TAVG_US_2010-2019.csv

# 파일의 각 상태에 대해
`cut -d'의 상태용,' -f1 $file | 정렬 | uniq`
do
    # 상태의 모든 온도 값 가져오기
    state_tavgs=`grep $state $file | cut -d',' -f5`
    # 이것이 몇 개의 타임 슬라이스가 될까요?
    # 기록된 온도의 수에서 타임슬라이스의 크기를 뺀 수
    num_slices=`echo $state_tavgs | wc -w`
    num_slices=$((${num_slices} - ${TIME_SLICE_PERIOD}))
    # 초기화
    slice_start=1; num_slice=0;
    # 각 타임슬라이스에 대해
    while [ $num_slice -lt $num_slices ]
    do
        # 하나의 타임슬라이스는 slice_start에서 slice_end까지
        slice_end=$( ($slice_start + $TIME_SLICE_PERIOD - 1))
        # X (1-20)
        sliceX="$slice_start-$slice_end"
        # y (21)
    $     slicey (($slice_end + 1))
        # 상태 및 타임슬라이스 온도 값 인쇄(1-20 및 21열)
        echo $state `echo $state_tavgs | cut -d' ' -f$sliceX,$slicey`
        # 증분
        slice_start=$(($slice_start + 1)); num_slice=$(($num_slice + 1));
    완료
완료

스크립트를 실행합니다. 공백을 열 구분자로 사용합니다. sed로 쉼표를 만드세요:

$ ./timeslices.sh > TIMESLICE_TAVG_US_2010-2019.csv; sed -i s/' '/,/g TIME_VARIANT_TAVG_US_2010-2019.csv 

다음은 .csv 출력의 처음 몇 줄과 마지막 몇 줄입니다.

$ 헤드 -3 TIME_VARIANT_TAVG_US_2009-2019.csv
AK,-271.271,-290.057,-300.324,-277.603,-270.36,-293.152,-2922.8 ,-158.379,-102.585,-24.9517,-1.7973,15.9597,-5.78231,-33.932,-44.7655,-962.5694,-123.338,-123.338
AK,-73,-292.5694,-123.379 -292.829,-270.413,-256.674,-241.546,-217.757,-158.379,-102.585,-24.9517,-59.39,-2973,15.9597,-5.73.493,-5.73231 AK,-300.324,-277.603,-270.36,-293.152,-292.829,-270.413,-256.674,-241.546,591.546,-391.546,-39.757,-158.379,-158.379,-5102. 44.7655,-92.5694,-123.338,-130.829,-123.979

$꼬리 -3 TIME_VARIANT_TAVG_US_2009-2019.csv
. ,-81.5556,-124.769,-137.556,-90.213,-54.1389,-55.9907,-30.9167,-9.59813,-293,-86916,-1.28259,-13.972>WY,-66.2315,-45.1944,-27.75,-55.3426,-81.5556,-124.769,-137.556,-90.213,-54.1389,-565.9907,-30.915 1.09259,-13.9722,-47.5648,-83.5234,-98.2963,-124.694,-142.898,-131.028
WY,-45.1944,-27.815,-55 54.1389,-55.9907,-30.9167,-9.59813,7.86916,-1.09259,-13.9722,-47.5648,-793.5234,-98.2963,-1984.694

이것은 작동하지만 성능이 그다지 좋지 않습니다. 최적화할 수 있습니다. 시도해 볼 수 있습니까? 어떻게 했는지 아래 댓글에 보고하세요.

5. 데이터 세트 학습, 테스트 및 검증 생성

데이터를 훈련으로 분할 , 테스트검증 세트.

data_sets.sh

#!/bin/sh

GEN=SEQ
# GEN=RAN

FILE=TIMESLICE_TAVG_US_2010-2019.csv

TRAIN_SET_PERCENT=70
TEST_SET_PERCENT=20
VAL_SET_PERCENT=$(( 100 - $TRAIN_SET_PERCENT - $TEST_SET_PERCENT ))

TRAIN_DATA=TRAIN_$FILE
TEST_DATA=TEST_$ 파일
VAL_DATA=VAL_$FILE

> $TRAIN_DATA
> $TEST_DATA
> $VAL_DATA

`cut -d의 상태용 ',' -f1 $FILE | 정렬 | uniq`
do
    NUM_STATE_DATA=`grep "$state" $FILE | wc -l`
    echo "$state:$NUM_STATE_DATA"

    TRAIN_NUM_DATA=$(( $NUM_STATE_DATA * $TRAIN_SET_PERCENT / 100 ))
    TEST_NUM_DATA=$(( $NUM_STATE_DATA $TEST_SET_PERCENT / 100 ))
    VAL_NUM_DATA=$(( $NUM_STATE_DATA - $TRAIN_NUM_DATA - $TEST_NUM_DATA ))

    if [ $GEN =="SEQ" ]
    then
        echo "순차적"
        STATE_DATA=`grep $state $FILE`
    elif [ $GEN =="RAN" ]
    then
        echo "무작위"
STATE_DATA=`grep $state $FILE | shuf`
    else
        echo "알 수 없는 데이터 생성 유형:" $GEN
        exit 1
    fi

    # 기차 세트
    per=$ TRAIN_SET_PERCENT
    num=$TRAIN_NUM_DATA; 에서 =1; to=$(($from + $num - 1));
    echo 기차 세트:$per% $num from=$from to=$to
    echo "$STATE_DATA" | head -$to>> $TRAIN_DATA

    # 테스트 세트
    per=$TEST_SET_PERCENT
    num=$TEST_NUM_DATA; from=$(($에서 + 1)); to=$(($from + $num - 1));
    echo 테스트 세트:$per% $num from=$from to=$to
    echo "$STATE_DATA" | 머리 -$to | tail -$num>> $TEST_DATA

    # 세트 유효성 검사
    per=$VAL_SET_PERCENT
    num=$VAL_NUM_DATA; from=$(($에서 + 1)); to=$NUM_STATE_DATA;
    echo 유효성 검사 세트:$per% $num from=$from to=$to
    echo "$STATE_DATA" | tail -$num>> $VAL_DATA

    echo
완료

이는 GEN=SEQ를 설정하여 순차적 또는 무작위화할 수 있는 데이터 세트를 생성합니다. 또는 GEN=RAN 스크립트에서 shuf로 데이터를 섞을 수 있습니다.

스크립트 실행:

$ ./data_sets.sh
AK:3652
순차
기차 세트:70% 2556 from=1 to=2556
테스트 세트:20% 730 from=2557 to=3286
검증 세트:10% 366 from=3287 to=3652

...

WY:3352
순차
기차 세트:70% 2346 from=1 to=2346
테스트 세트:20% 670 from=2347 to=3016
검증 세트:10% 336 from=3017 to=3352

이러한 데이터 파일을 생성하려면:

$ ls *_TIMESLICE_TAVG_US_2010-2019.csv
TEST_TIMESLICE_TAVG_US_2010-2019.csv   VAL_TIMESLICE_TAVG_US_2010-2019.csv
TRAIN_TIMESLICE_20

쉘로 데이터 처리

다음 머신 러닝 프로젝트를 위해 엄청난 양의 데이터를 처리해야 하는 경우 셸 명령과 스크립트에 대해 생각해 보십시오. 입증되었으며 친절한 커뮤니티와 함께 ​​사용하여 귀하를 안내하고 도울 준비가 되어 있습니다.

이 기사는 데이터 처리를 위한 쉘을 소개하고 스크립트는 기회를 보여줍니다. 훨씬 더 많은 것이 가능합니다. 앞으로 가져가시겠습니까? 아래 댓글로 알려주세요.