BASHプログラミング
 Computer >> コンピューター >  >> プログラミング >> BASHプログラミング

Bashを使用して機械学習モデルを作成する

機械学習は、従来のアルゴリズムでは難しいと感じることを予測または予測するための強力なコンピューティング機能です。機械学習の旅は、データの収集と準備から始まります。ロット 次に、そのデータに基づいて数学モデルを構築します。これらのタスクには複数のツールを使用できますが、私はシェルを使用するのが好きです。

シェルは、定義された言語を使用して操作を実行するためのインターフェースです。この言語は、インタラクティブに呼び出すことも、スクリプト化することもできます。シェルの概念は、1970年代にUnixオペレーティングシステムに導入されました。最も人気のあるシェルには、Bash、tcsh、Zshなどがあります。 Linux、macOS、Windowsを含むすべてのオペレーティングシステムで利用できるため、移植性が高くなります。この演習では、Bashを使用します。

この記事は、データ収集とデータ準備にシェルを使用する方法の概要です。効率的なツールを探しているデータサイエンティストでも、機械学習にスキルを使用することを検討しているシェルエキスパートでも、ここで貴重な情報が見つかることを願っています。

この記事の問題の例は、米国の州の気温を予測するための機械学習モデルを作成することです。シェルコマンドとスクリプトを使用して、次のデータ収集とデータ準備の手順を実行します。

  1. データをダウンロード
  2. 必要なフィールドを抽出します
  3. 集合体データ
  4. 時系列を作成する
  5. トレーニング、テスト、検証のデータセットを作成します

Pythonなどの機械学習プログラミング言語ですべてを実行できるのに、なぜこれをシェルで実行する必要があるのか​​と疑問に思われるかもしれません。これは良い質問です。シェルのような簡単で使いやすく、豊富なテクノロジーを使用してデータ処理を実行する場合、データサイエンティストは機械学習のモデリングのみに焦点を当て、言語の詳細には焦点を当てません。

前提条件

まず、シェルインタープリターをインストールする必要があります。 LinuxまたはmacOSを使用している場合は、すでにインストールされており、既にご存知かもしれません。 Windowsを使用している場合は、MinGWまたはCygwinを試してください。

詳細については、以下を参照してください:

  • opensource.comのBashチュートリアル
  • Bourneシェルの作成者であるSteveParkerによる公式のシェルスクリプトチュートリアル
  • LinuxDocumentationProjectによる初心者向けのBashガイド
  • 特定のコマンドについてヘルプが必要な場合は、 --helpと入力します ヘルプのためのシェルで;例: ls --help

はじめに

シェルが設定されたので、機械学習の温度予測問題のデータの準備を開始できます。

1。データのダウンロード

このチュートリアルのデータは、米国海洋大気庁(NOAA)からのものです。過去10年間のデータを使用してモデルをトレーニングします。データソースはhttps://www1.ncdc.noaa.gov/pub/data/ghcn/daily/by_year/にあり、データは.csv形式でgzip圧縮されています。

シェルスクリプトを使用してデータをダウンロードして解凍します。お気に入りのテキストエディタを使用して、 download.shという名前のファイルを作成します 以下のコードを貼り付けます。コード内のコメントは、コマンドの機能を説明しています。

#!/bin/sh
# This is called hashbang. It identifies the executor used to run this file.
# In this case, the script is executed by shell itself.
# If not specified, a program to execute the script must be specified.
# With hashbang: ./download.sh;  Without hashbang: sh ./download.sh;

FROM_YEAR=2010
TO_YEAR=2019

year=$FROM_YEAR
# For all years one by one starting from FROM_YEAR=2010 upto TO_YEAR=2019
while [ $year -le $TO_YEAR ]
do
    # show the year being downloaded now
    echo $year
    # Download
    wget https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/by_year/${year}.csv.gz
    # Unzip
    gzip -d ${year}.csv.gz
    # Move to next year by incrementing
    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は、コマンドラインからWebサーバーに接続するためのユーティリティです。 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
Resolving www1.ncdc.noaa.gov (www1.ncdc.noaa.gov)... 205.167.25.171, 205.167.25.172, 205.167.25.178, ...
Connecting to www1.ncdc.noaa.gov (www1.ncdc.noaa.gov)|205.167.25.171|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 170466817 (163M) [application/gzip]
Saving to: '2010.csv.gz'

     0K .......... .......... .......... .......... ..........  0% 69.4K 39m57s
    50K .......... .......... .......... .......... ..........  0%  202K 26m49s
   100K .......... .......... .......... .......... ..........  0% 1.08M 18m42s

...

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  2018.csv  2019.csv

2。平均気温を抽出する

米国地域のCSVからTAVG(平均気温)データを抽出します。

extract_tavg_us.sh

#!/bin/sh

# For each file with name that starts with "20" and ens with ".csv"
for csv_file in `ls 20*.csv`
do
    # Message that says file name $csv_file is extracted to file TAVG_US_$csv_file
    # Example: 2010.csv extracted to TAVG_US_2010.csv
    echo "$csv_file -> TAVG_US_$csv_file"
    # grep "TAVG" $csv_file: Extract lines in file with text "TAVG"
    # |: pipe
    # grep "^US": From those extract lines that begin with text "US"
    # > TAVG_US_$csv_file: Save xtracted lines to file TAVG_US_$csv_file
    grep "TAVG" $csv_file | grep "^US" > TAVG_US_$csv_file
done

このスクリプト:

$ ./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_2016.csv  TAVG_US_2017.csv
TAVG_US_2018.csv  TAVG_US_2019.csv

TAVG_US_2010.csvの最初の数行は次のとおりです :

$ head TAVG_US_2010.csv
USR0000AALC,20100101,TAVG,-220,,,U,
USR0000AALP,20100101,TAVG,-9,,,U,
USR0000ABAN,20100101,TAVG,12,,,U,
USR0000ABCA,20100101,TAVG,16,,,U,
USR0000ABCK,20100101,TAVG,-309,,,U,
USR0000ABER,20100101,TAVG,-81,,,U,
USR0000ABEV,20100101,TAVG,-360,,,U,
USR0000ABEN,20100101,TAVG,-224,,,U,
USR0000ABNS,20100101,TAVG,89,,,U,
USR0000ABLA,20100101,TAVG,59,,,U,

headコマンドは、ファイルの最初の数行(デフォルトでは10行)を表示するためのユーティリティです。

データには、必要以上の情報が含まれています。列3(すべてのデータは平均温度であるため)と列5以降を削除して、列の数を制限します。つまり、列1(気候ステーション)、2(日付)、および4(温度を記録)を保持します。

key_columns.sh

#!/bin/sh

# For each file with name that starts with "TAVG_US_" and ens with ".csv"
for csv_file in `ls TAVG_US_*.csv`
do
    echo "Exractiing columns $csv_file"
    # cat $csv_file: 'cat' is to con'cat'enate files - here used to show one year csv file
    # |: pipe
    # cut -d',' -f1,2,4: Cut columns 1,2,4 with , delimitor
    # > $csv_file.cut: Save to temporary file
    | > $csv_file.cut:
    cat $csv_file | cut -d',' -f1,2,4 > $csv_file.cut
    # mv $csv_file.cut $csv_file: Rename temporary file to original file
    mv $csv_file.cut $csv_file
    # File is processed and saved back into the same
    # There are other ways to do this
    # Using intermediate file is the most reliable method.
done

スクリプトを実行します:

$ ./key_columns.sh
Extracting columns TAVG_US_2010.csv
...
Extracting columns TAVG_US_2019.csv

TAVG_US_2010.csvの最初の数行 不要なデータが削除されたものは次のとおりです。

$ head TAVG_US_2010.csv
USR0000AALC,20100101,-220
USR0000AALP,20100101,-9
USR0000ABAN,20100101,12
USR0000ABCA,20100101,16
USR0000ABCK,20100101,-309
USR0000ABER,20100101,-81
USR0000ABEV,20100101,-360
USR0000ABEN,20100101,-224
USR0000ABNS,20100101,89
USR0000ABLA,20100101,59

日付は文字列形式(YMD)です。モデルを正しくトレーニングするには、アルゴリズムでカンマ区切りのY、M、D形式の日付フィールドを認識する必要があります(例: 20100101 2010,01,01になります )。 sedユーティリティで変換できます。

date_format.sh

for csv_file in `ls TAVG_*.csv`
do
    echo Date formatting $csv_file
    # This inserts , after year
    sed -i 's/,..../&,/' $csv_file
    # This inserts , after month
    sed -i 's/,....,../&,/' $csv_file
done

スクリプトを実行します:

$ ./date_format.sh
Date formatting TAVG_US_2010.csv
...
Date formatting TAVG_US_2019.csv

TAVG_US_2010.csvの最初の数行 カンマ区切りの日付形式は次のとおりです。

$ head TAVG_US_2010.csv
USR0000AALC,2010,01,01,-220
USR0000AALP,2010,01,01,-9
USR0000ABAN,2010,01,01,12
USR0000ABCA,2010,01,01,16
USR0000ABCK,2010,01,01,-309
USR0000ABER,2010,01,01,-81
USR0000ABEV,2010,01,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  -98.5069  598.0 NE JUNIATA 1.5 S
...

catを使用してファイルを印刷し、trを使用して繰り返しを絞り、一時ファイルに出力し、一時ファイルの名前を元の名前に戻すことで、一貫性を保ちます。すべて1行で:

$ 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 -98.5069 598.0 NE JUNIATA 1.5 S
...

これには、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
...

これらのタスクにはいくつかのコマンドを使用しましたが、1回の実行ですべてのステップを実行することができます。自分で試してみてください。

次に、大規模なデータ処理で機能的に高いパフォーマンスを発揮するAWKを使用して、ステーションコードを州の場所に置き換えます。

station_to_state_data.sh

#!/bin/sh

for DATA_FILE in `ls TAVG_US_*.csv`

do
    echo ${DATA_FILE}
    awk -v FILE=$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) {
                print state_day_key "," state_day_sum[state_day_key]/state_day_num[state_day_key]
            }
        }
    ' OFS=, $DATA_FILE > STATE_DAY_${DATA_FILE}.tmp
    sort -k1 -k2 -k3 -k4 < STATE_DAY_${DATA_FILE}.tmp > STATE_DAY_$DATA_FILE
    rm -f STATE_DAY_${DATA_FILE}.tmp
done

これらのパラメータの意味は次のとおりです。

-F、 フィールドセパレータはです
FNR 各ファイルの行番号
NR 両方のファイルの行番号を一緒に
FNR ==NR 最初のファイルでのみTRUE$ {PATTERN_FILE}
{x [$ 1] =$ 2;次; } FNR ==NRの場合 はTRUEです( $ PATTERN_FILEのすべての行に対して のみ)
-x station =stateを保存する変数 地図
-x [$ 1] =$ 2 station =stateのデータを追加します マップする
-$ 1 最初のファイルの最初の列(ステーションコード)
-$ 2 最初のファイルの2番目の列(状態コード)
-x すべての駅の地図(例: x [US009052008] =SD ) 、 x [US10RMHS145] =CO 、...、 x [USW00096409] =AK
-次へ FNR ==NRに一致する次の行に移動します (基本的に、これにより、 $ {PATTERN_FILE}からすべての駅の状態の地図が作成されます。
{$1 =x [$ 1]; $0を印刷} FNR ==NRの場合 FALSEです($ DATA_FILEののすべての行に対して のみ)
-$ 1 =x [$ 1] 最初のフィールドをx[$ 1]に置き換えます;基本的に、駅コードを州コードに置き換えます
-$0を印刷 すべての列を印刷します(置き換えられた $ 1を含む )
OFS =、 出力フィールドの区切り文字はです

ステーションコード付きのCSV:

$ head TAVG_US_2010.csv
USR0000AALC,2010,01,01,-220
USR0000AALP,2010,01,01,-9
USR0000ABAN,2010,01,01,12
USR0000ABCA,2010,01,01,16
USR0000ABCK,2010,01,01,-309
USR0000ABER,2010,01,01,-81
USR0000ABEV,2010,01,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

ステーションが州にマッピングされるようになりました:

$ head 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

すべての州には、毎日いくつかの温度測定値があるため、1日の各州の測定値の平均を計算する必要があります。テキスト処理にはAWKを使用し、最終結果が論理的な順序になるように並べ替え、処理後に一時ファイルを削除するにはrmを使用します。

station_to_state_data.sh

PATTERN_FILE=us_stations.txt

for DATA_FILE in `ls TAVG_US_*.csv`
do
    echo ${DATA_FILE}

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

   mv ${DATA_FILE}.tmp ${DATA_FILE}
done

AWKパラメータの意味は次のとおりです。

FILE =$ DATA_FILE CSVファイルはFILEとして処理されます
-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 =、 出力フィールドの区切り文字はです
$ DATA_FILE 入力ファイル(名前が TAVG_US_で始まるすべてのファイル .csvで終わります 、1つずつ)
> 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_2015.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年間のデータを表示します(一度に1ページの出力を表示するユーティリティは少なくなります):

$ less 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

すべてのデータファイルを1つにマージします:

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

これで、すべての年のすべての状態を含む1つのファイルができました:

$ cat 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日を1つのスライスと見なします。

これは1回限りのスライスです( STATE_DAY_TAVG_US_2010.csv のように) ):

X (input – 20 weeks):
AK,2010,01,01,-181.934
AK,2010,01,02,-199.531
...
AK,2010,01,20,-157.273

y (21st week, prediction for these 20 weeks):
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

# For each state in file
for state in `cut -d',' -f1 $file | sort | uniq`
do
    # Get all temperature values for the state
    state_tavgs=`grep $state $file | cut -d',' -f5`
    # How many time slices will this result in?
    # mber of temperatures recorded minus size of one timeslice
    num_slices=`echo $state_tavgs | wc -w`
    num_slices=$((${num_slices} - ${TIME_SLICE_PERIOD}))
    # Initialize
    slice_start=1; num_slice=0;
    # For each timeslice
    while [ $num_slice -lt $num_slices ]
    do
        # One timeslice is from slice_start to slice_end
        slice_end=$(($slice_start + $TIME_SLICE_PERIOD - 1))
        # X (1-20)
        sliceX="$slice_start-$slice_end"
        # y (21)
        slicey=$(($slice_end + 1))
        # Print state and timeslice temperature values (column 1-20 and 21)
        echo $state `echo $state_tavgs | cut -d' ' -f$sliceX,$slicey`
        # Increment
        slice_start=$(($slice_start + 1)); num_slice=$(($num_slice + 1));
    done
done

スクリプトを実行します。列の区切り文字としてスペースを使用します。 sedでコンマにします:

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

出力.csvの最初の数行と最後の数行は次のとおりです。

$ head -3 TIME_VARIANT_TAVG_US_2009-2019.csv
AK,-271.271,-290.057,-300.324,-277.603,-270.36,-293.152,-292.829,-270.413,-256.674,-241.546,-217.757,-158.379,-102.585,-24.9517,-1.7973,15.9597,-5.78231,-33.932,-44.7655,-92.5694,-123.338
AK,-290.057,-300.324,-277.603,-270.36,-293.152,-292.829,-270.413,-256.674,-241.546,-217.757,-158.379,-102.585,-24.9517,-1.7973,15.9597,-5.78231,-33.932,-44.7655,-92.5694,-123.338,-130.829
AK,-300.324,-277.603,-270.36,-293.152,-292.829,-270.413,-256.674,-241.546,-217.757,-158.379,-102.585,-24.9517,-1.7973,15.9597,-5.78231,-33.932,-44.7655,-92.5694,-123.338,-130.829,-123.979

$ tail -3 TIME_VARIANT_TAVG_US_2009-2019.csv
WY,-76.9167,-66.2315,-45.1944,-27.75,-55.3426,-81.5556,-124.769,-137.556,-90.213,-54.1389,-55.9907,-30.9167,-9.59813,7.86916,-1.09259,-13.9722,-47.5648,-83.5234,-98.2963,-124.694,-142.898
WY,-66.2315,-45.1944,-27.75,-55.3426,-81.5556,-124.769,-137.556,-90.213,-54.1389,-55.9907,-30.9167,-9.59813,7.86916,-1.09259,-13.9722,-47.5648,-83.5234,-98.2963,-124.694,-142.898,-131.028
WY,-45.1944,-27.75,-55.3426,-81.5556,-124.769,-137.556,-90.213,-54.1389,-55.9907,-30.9167,-9.59813,7.86916,-1.09259,-13.9722,-47.5648,-83.5234,-98.2963,-124.694,-142.898,-131.028,-79.8704

これは機能しますが、パフォーマンスはあまり高くありません。最適化できます。試してみてください。以下のコメントで、どのようにそれを行ったかを報告してください。

5。トレーニングの作成、データセットのテスト、検証

データをtrainに分割します 、テスト 、および検証 セット。

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_$FILE
VAL_DATA=VAL_$FILE

> $TRAIN_DATA
> $TEST_DATA
> $VAL_DATA

for state in `cut -d',' -f1 $FILE | sort | 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 "Sequential"
        STATE_DATA=`grep $state $FILE`
    elif [ $GEN == "RAN" ]
    then
        echo "Randomized"
        STATE_DATA=`grep $state $FILE | shuf`
    else
        echo "Unknown data gen type: " $GEN
        exit 1
    fi

    # Train set
    per=$TRAIN_SET_PERCENT
    num=$TRAIN_NUM_DATA; from=1; to=$(($from + $num - 1));
    echo Train set: $per% $num from=$from to=$to
    echo "$STATE_DATA" | head -$to >> $TRAIN_DATA

    # Test set
    per=$TEST_SET_PERCENT
    num=$TEST_NUM_DATA; from=$(($to + 1)); to=$(($from + $num - 1));
    echo Test set: $per% $num from=$from to=$to
    echo "$STATE_DATA" | head -$to | tail -$num >> $TEST_DATA

    # Validate set
    per=$VAL_SET_PERCENT
    num=$VAL_NUM_DATA; from=$(($to + 1)); to=$NUM_STATE_DATA;
    echo Validate set: $per% $num from=$from to=$to
    echo "$STATE_DATA" | tail -$num >> $VAL_DATA

    echo
done

これにより、 GEN =SEQ を設定することにより、順次またはランダム化できるデータセットが生成されます。 またはGEN=RAN スクリプトで、shufを使用してデータをシャッフルできます。

スクリプトを実行します:

$ ./data_sets.sh
AK: 3652
Sequential
Train set: 70% 2556 from=1 to=2556
Test set: 20% 730 from=2557 to=3286
Validate set: 10% 366 from=3287 to=3652

...

WY: 3352
Sequential
Train set: 70% 2346 from=1 to=2346
Test set: 20% 670 from=2347 to=3016
Validate set: 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_TAVG_US_2010-2019.csv
シェルを使用したデータ処理

次の機械学習プロジェクトのために膨大な量のデータを処理する必要がある場合は、シェルコマンドとスクリプトについて考えてください。それは証明されており、友好的なコミュニティであなたを導き、助けるために使用する準備ができています。

この記事では、データ処理用のシェルを紹介し、スクリプトで機会を示します。さらに多くのことが可能です。あなたはそれを前進させたいですか?以下のコメントで教えてください。


  1. Excel でデータ モデルを管理する方法 (簡単な手順)

    管理方法を学ぶ必要がある データ モデル エクセルで ?そのようなユニークな種類のトリックを探しているなら、あなたは正しい場所に来ました.この記事では、データ モデルを管理するすべての手順について説明します エクセルで。ここでは、これらすべてを学ぶための完全なガイドラインを紹介します。 次の Excel ワークブックをダウンロードして、理解を深め、練習してください。 Excel のデータ モデルとは Excel データ モデル 2 つ以上のテーブルが 1 つ以上の共有データ セットを介して相互に関連付けられている、特定の形式のデータ テーブルです。 データ モデルのすべてのテーブルのデ

  2. Excel でデータ モデルを作成する方法 (3 つの便利な方法)

    データ モデルは、データ分析に不可欠な機能です。データ モデルを使用して、データ (テーブルなど) を Excel にロードできます。 メモリー。次に、Excel に伝えることができます 共通の列を使用してデータを接続します。各テーブル間の関係は、「モデル」という言葉で表されます データモデルで。 エクセル は、データ モデルを作成する複数の方法を提供します。この記事では、Excel でデータ モデルを作成する方法について説明します。 Excel でデータ モデルを作成する 3 つの便利な方法 この記事では、 3 について説明します Excel でデータ モデルを作成する