কম্পিউটার

ব্যাশ দিয়ে একটি মেশিন লার্নিং মডেল তৈরি করুন

মেশিন লার্নিং হল ভবিষ্যদ্বাণী বা পূর্বাভাস দেওয়ার জন্য একটি শক্তিশালী কম্পিউটিং ক্ষমতা যা প্রচলিত অ্যালগরিদমগুলিকে চ্যালেঞ্জিং বলে মনে করে। মেশিন লার্নিং যাত্রা শুরু হয় ডেটা সংগ্রহ এবং প্রস্তুত করার মাধ্যমে—একটি অনেক এর - তারপর এটি সেই ডেটার উপর ভিত্তি করে গাণিতিক মডেল তৈরি করে। যদিও এই কাজের জন্য একাধিক টুল ব্যবহার করা যেতে পারে, আমি শেল ব্যবহার করতে পছন্দ করি।

একটি শেল একটি সংজ্ঞায়িত ভাষা ব্যবহার করে অপারেশন সম্পাদনের জন্য একটি ইন্টারফেস। এই ভাষাটি ইন্টারেক্টিভভাবে বা স্ক্রিপ্টে আমন্ত্রণ জানানো যেতে পারে। 1970-এর দশকে ইউনিক্স অপারেটিং সিস্টেমে শেল ধারণাটি চালু করা হয়েছিল। কিছু জনপ্রিয় শেলের মধ্যে রয়েছে Bash, tcsh এবং Zsh। এগুলি Linux, macOS এবং Windows সহ সমস্ত অপারেটিং সিস্টেমের জন্য উপলব্ধ, যা তাদের উচ্চ বহনযোগ্যতা দেয়৷ এই অনুশীলনের জন্য, আমি ব্যাশ ব্যবহার করব।

এই নিবন্ধটি ডেটা সংগ্রহ এবং ডেটা প্রস্তুতির জন্য একটি শেল ব্যবহার করার একটি ভূমিকা। আপনি দক্ষ টুলস খুঁজছেন একজন ডাটা সায়েন্টিস্ট বা মেশিন লার্নিং এর জন্য আপনার দক্ষতা ব্যবহার করার জন্য একজন শেল বিশেষজ্ঞ হোন না কেন, আমি আশা করি আপনি এখানে মূল্যবান তথ্য পাবেন।

এই নিবন্ধের উদাহরণ সমস্যাটি হল মার্কিন রাজ্যগুলির তাপমাত্রার পূর্বাভাস দেওয়ার জন্য একটি মেশিন লার্নিং মডেল তৈরি করা। এটি নিম্নলিখিত ডেটা সংগ্রহ এবং ডেটা প্রস্তুতির ধাপগুলি করতে শেল কমান্ড এবং স্ক্রিপ্ট ব্যবহার করে:

  1. ডেটা ডাউনলোড করুন
  2. প্রয়োজনীয় ক্ষেত্রগুলি বের করুন
  3. সমষ্টিগত ডেটা
  4. টাইম সিরিজ তৈরি করুন
  5. ট্রেন তৈরি করুন, পরীক্ষা করুন এবং ডেটা সেট যাচাই করুন

আপনি হয়তো জিজ্ঞাসা করছেন কেন আপনি শেল দিয়ে এটি করবেন, যখন আপনি পাইথনের মতো একটি মেশিন লার্নিং প্রোগ্রামিং ভাষায় এটি করতে পারেন। এটা একটা ভালো প্রশ্ন। শেলের মতো সহজ, বন্ধুত্বপূর্ণ, সমৃদ্ধ প্রযুক্তির সাহায্যে ডেটা প্রসেসিং করা হলে, একজন ডেটা সায়েন্টিস্ট শুধুমাত্র মেশিন লার্নিং মডেলিংয়ে ফোকাস করেন, ভাষার বিবরণ নয়।

পূর্বশর্ত

প্রথমত, আপনাকে একটি শেল ইন্টারপ্রেটার ইনস্টল করতে হবে। আপনি যদি লিনাক্স বা ম্যাকোস ব্যবহার করেন তবে এটি ইতিমধ্যেই ইনস্টল করা থাকবে এবং আপনি ইতিমধ্যেই এটির সাথে পরিচিত হতে পারেন। আপনি যদি উইন্ডোজ ব্যবহার করেন, তাহলে MinGW বা Cygwin ব্যবহার করে দেখুন।

আরও তথ্যের জন্য, দেখুন:

  • বাশ টিউটোরিয়াল এখানে opensource.com এ
  • বোর্ন শেলের স্রষ্টা স্টিভ পার্কারের অফিসিয়াল শেল স্ক্রিপ্টিং টিউটোরিয়াল
  • লিনাক্স ডকুমেন্টেশন প্রজেক্ট দ্বারা নতুনদের জন্য ব্যাশ গাইড
  • যদি আপনার একটি নির্দিষ্ট কমান্ডের সাহায্যের প্রয়োজন হয়, তাহলে --help টাইপ করুন সাহায্যের জন্য শেল মধ্যে; উদাহরণস্বরূপ:ls --help .

শুরু করুন

এখন আপনার শেল সেট আপ করা হয়েছে, আপনি মেশিন লার্নিং তাপমাত্রা-পূর্বাভাস সমস্যার জন্য ডেটা প্রস্তুত করা শুরু করতে পারেন৷

1. ডেটা ডাউনলোড করুন

এই টিউটোরিয়ালের জন্য ডেটা আসে US National Oceanic and Atmospheric Administration (NOAA) থেকে। আপনি শেষ 10 সম্পূর্ণ বছরের ডেটা ব্যবহার করে আপনার মডেলকে প্রশিক্ষণ দেবেন। ডেটার উৎস https://www1.ncdc.noaa.gov/pub/data/ghcn/daily/by_year/, এবং ডেটা .csv ফর্ম্যাটে এবং জিজিপ করা আছে।

একটি শেল স্ক্রিপ্ট ব্যবহার করে ডেটা ডাউনলোড এবং আনজিপ করুন। download.sh নামে একটি ফাইল তৈরি করতে আপনার প্রিয় পাঠ্য সম্পাদক ব্যবহার করুন এবং নিচের কোডে পেস্ট করুন। কোডের মন্তব্যগুলি ব্যাখ্যা করে যে কমান্ডগুলি কী করে:

#!/bin/sh
# একে হ্যাশব্যাং বলে। এটি এই ফাইলটি চালানোর জন্য ব্যবহৃত এক্সিকিউটরকে সনাক্ত করে৷
# এই ক্ষেত্রে, স্ক্রিপ্টটি শেল দ্বারাই কার্যকর করা হয়৷
# যদি নির্দিষ্ট না করা হয়, তাহলে স্ক্রিপ্ট চালানোর জন্য একটি প্রোগ্রাম নির্দিষ্ট করতে হবে৷
# হ্যাশব্যাং সহ:./download.sh; হ্যাশব্যাং ছাড়া:sh ./download.sh;

FROM_YEAR=2010
TO_YEAR=2019

year=$FROM_YEAR
# সব বছরের জন্য এক দ্বারা একটি FROM_YEAR=2010 থেকে শুরু করে TO_YEAR=2019 পর্যন্ত
যখন [ $year -le $TO_YEAR ]
করুন
    # এখন ডাউনলোড করা বছর দেখান
    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))
সম্পন্ন

নোট:

  • যদি আপনি একটি প্রক্সি সার্ভারের পিছনে থাকেন, তাহলে মার্ক গ্রেনান-এর সাথে পরামর্শ করুন কীভাবে করবেন, এবং ব্যবহার করুন:
    export http_proxy=https://username:password@proxyhost:port/
    export https_proxy=https://username:password@proxyhost:port/
  • নিশ্চিত করুন যে সমস্ত স্ট্যান্ডার্ড কমান্ড ইতিমধ্যেই আপনার PATH-এ রয়েছে (যেমন /bin অথবা /usr/bin ) যদি না হয়, আপনার পথ সেট করুন।
  • Wget কমান্ড লাইন থেকে ওয়েব সার্ভারের সাথে সংযোগ করার জন্য একটি ইউটিলিটি। যদি আপনার সিস্টেমে Wget ইন্সটল না থাকে, তাহলে ডাউনলোড করুন।
  • নিশ্চিত করুন যে আপনার কাছে জিজিপ আছে, এটি কম্প্রেশন এবং ডিকম্প্রেশনের জন্য ব্যবহৃত একটি ইউটিলিটি।

CSV হিসাবে 10 বছরের মূল্যের ডেটা ডাউনলোড, এক্সট্র্যাক্ট এবং উপলব্ধ করতে এই স্ক্রিপ্টটি চালান:

$ ./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)-এর সাথে সংযোগ করা হচ্ছে>দৈর্ঘ্য:170466817 (163M) [application/gzip]
এতে সংরক্ষণ করা হচ্ছে:'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

# প্রতিটি ফাইলের জন্য যার নাম "20" দিয়ে শুরু হয় এবং ".csv" দিয়ে শেষ হয়
`ls 20*.csv`-এ csv_file-এর জন্য
করুন
  # বার্তা যা বলে যে ফাইলের নাম $csv_file ফাইলটি TAVG_US_$csv_file থেকে বের করা হয়েছে
    # উদাহরণ:2010.csv থেকে TAVG_US_2010.csv
    echo "$csv_US_2010.csv-এ বের করা হয়েছে -> T_> $csv_file"
  # grep "TAVG" $csv_file:"TAVG" টেক্সট সহ ফাইলে লাইনগুলি এক্সট্র্যাক্ট করুন
  # |:pipe
  # grep "^US":সেই এক্সট্র্যাক্ট লাইনগুলি থেকে যা দিয়ে শুরু হয় টেক্সট "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_2014.csv_201012012010.201010.201010.201.201.201.201.2010.। csv

এখানে TAVG_US_2010.csv এর জন্য প্রথম কয়েকটি লাইন রয়েছে :

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

হেড কমান্ড হল একটি ফাইলের প্রথম কয়েকটি লাইন (ডিফল্টভাবে, 10টি লাইন) প্রদর্শন করার জন্য একটি ইউটিলিটি।

ডেটাতে আপনার প্রয়োজনের চেয়ে বেশি তথ্য রয়েছে। কলাম 3 (যেহেতু সমস্ত ডেটা গড় তাপমাত্রা) এবং কলাম 5 বাদ দিয়ে কলামের সংখ্যা সীমিত করুন। অন্য কথায়, কলাম 1 (জলবায়ু স্টেশন), 2 (তারিখ), এবং 4 (তাপমাত্রা রেকর্ড করা) রাখুন।

key_columns.sh

#!/bin/sh

# প্রতিটি ফাইলের জন্য যার নাম "TAVG_US_" দিয়ে শুরু হয় এবং ".csv" দিয়ে শেষ হয়
csv_file-এর জন্য `ls TAVG_US_*.csv`
করুন
    echo "Exractiing columns $csv_file"
    # cat $csv_file:'cat' হল ফাইলগুলিকে con'cat'enate করতে - এখানে এক বছরের csv ফাইল দেখানোর জন্য ব্যবহৃত হয়
    # |:পাইপ
  # cut -d',' -f1,2,4:1,2,4 কলাম কাটা , delimitor
     #> $csv_file.cut:অস্থায়ী ফাইলে সংরক্ষণ করুন
|> $csv_file.cut:
  cat $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 এর প্রথম কয়েকটি লাইন অপসারিত অপ্রয়োজনীয় ডেটা সহ:

$ head TAVG_US_2010.csv
USR0000AALC,20100101,-220
USR0000AALP,20100101,-9
USR0000ABAN,20100101,12
USR0101,12
USR0101,12
USR0000ABCK,20100101,-309
USR0000ABER,20100101,-81
USR0000ABEV,20100101,-360
USR0000ABEN,20100101,-USR0101,-2010BR>USR0101,-2010BR> ,20100101,59

তারিখগুলি স্ট্রিং আকারে (YMD)। আপনার মডেলকে সঠিকভাবে প্রশিক্ষিত করতে, আপনার অ্যালগরিদমগুলিকে কমা-বিভক্ত Y,M,D ফর্মে তারিখের ক্ষেত্রগুলি চিনতে হবে (উদাহরণস্বরূপ, 20100101 2010,01,01 হয়ে যায় ) আপনি সেড ইউটিলিটি দিয়ে তাদের রূপান্তর করতে পারেন।

date_format.sh

 csv_file-এর জন্য `ls TAVG_*.csv`
করুন
  ইকো তারিখ বিন্যাস $csv_file
    # এই সন্নিবেশ, বছরের পর
  sed -i 's/,.. । /প্রে>

স্ক্রিপ্ট চালান:

$ ./date_format.sh
তারিখ বিন্যাস TAVG_US_2010.csv
...
তারিখ বিন্যাস 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,
br />USR0000ABCA,2010,01,01,16
USR0000ABCK,2010,01,01,-309
USR0000ABER,2010,01,01,-81
USR0000,ABEV,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 

এই ফাইলটি সুন্দর মুদ্রণের জন্য তৈরি করা হয়েছিল, তাই কলাম বিভাজকগুলি অসঙ্গত:

 $ প্রধান us_stations.txt 
US009052008 43.7333 -96.6333 482.0 এসডি সিউক্স ফলস (পরিবেশ। S
...

ফাইলটি প্রিন্ট করার জন্য cat ব্যবহার করে, টেম্প ফাইলে পুনরাবৃত্তি এবং আউটপুট স্কুইজ করার জন্য tr ব্যবহার করে এবং টেম্প ফাইলটিকে মূলে পুনরায় নামকরণ করে তাদের সামঞ্জস্যপূর্ণ করুন—সবকিছু এক লাইনে:

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

কমান্ডের আউটপুটের প্রথম লাইন:

 $ প্রধান us_stations.txt 
US009052008 43.7333 -96.6333 482.0 এসডি সিউক্স ফলস (পরিবেশ। 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
...

যদিও আপনি এই কাজের জন্য বেশ কয়েকটি কমান্ড ব্যবহার করেছেন, তবে এক দৌড়ে সমস্ত পদক্ষেপগুলি সম্পাদন করা সম্ভব। নিজে চেষ্টা করে দেখুন।

এখন, AWK ব্যবহার করে স্টেশন কোডগুলিকে তাদের রাজ্যের অবস্থানগুলির সাথে প্রতিস্থাপন করুন, যা বৃহৎ ডেটা প্রক্রিয়াকরণের জন্য কার্যকরীভাবে উচ্চ কার্যকারিতা।

station_to_state_data.sh

#!/bin/sh

`ls TAVG_US_*.csv`তে DATA_FILE এর জন্য

করুন
    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 {
            (state_day_key in state_day_sum) {
              print state_day_key "," state_day_sum[state_day_key]/state_day_num[state_day_key]
          =OF>
         > OF , $DATA_FILE> STATE_DAY_${DATA_FILE}.tmp
    সাজান -k1 -k2 -k3 -k4 STATE_DAY_$DATA_FILE
    rm -f STATE_DAY_T${DATA_DAY.mp
সম্পন্ন

এই পরামিতিগুলির অর্থ এখানে:

-F, ক্ষেত্র বিভাজক হল ,
FNR প্রতিটি ফাইলে লাইন নম্বর
NR একসাথে উভয় ফাইলে লাইন নম্বর
FNR==NR শুধুমাত্র প্রথম ফাইলে সত্য ${PATTERN_FILE}
{ x[$1]=$2; পরবর্তী; যদি FNR==NR সত্য ($PATTERN_FILE-এর সমস্ত লাইনের জন্য শুধুমাত্র)
- x station=state সঞ্চয় করার জন্য পরিবর্তনশীল মানচিত্র
- x[$1]=$2 station=state-এর ডেটা যোগ করে ম্যাপ করতে
- $1 প্রথম ফাইলের প্রথম কলাম (স্টেশন কোড)
- $2 প্রথম ফাইলে দ্বিতীয় কলাম (স্টেট কোড)
- x সমস্ত স্টেশনের মানচিত্র যেমন, x[US009052008]=SD , x[US10RMHS145]=CO , ..., x[USW00096409]=AK
- পরবর্তী FNR==NR মেলে পরবর্তী লাইনে যান (মূলত, এটি ${PATTERN_FILE} থেকে সমস্ত স্টেশন-স্টেটের একটি মানচিত্র তৈরি করে
{ $1=x[$1]; $0 } প্রিন্ট করুন যদি FNR==NR মিথ্যা ($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,
br />USR0000ABCA,2010,01,01,16
USR0000ABCK,2010,01,01,-309
USR0000ABER,2010,01,01,-81
USR0000,ABEV,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

স্টেশনগুলি এখন রাজ্যগুলিতে ম্যাপ করা হয়েছে:

$ head TAVG_US_2010.csv
AK,2010,01,01,-220
AZ,2010,01,01,-9
AL,2010,01,01,12AK,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

DATA_FILE এর জন্য `ls TAVG_US_*.csv`
করুন
    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 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 শেষ পর্যন্ত, সমস্ত রাজ্য, বছর, মাস, দিনগুলির জন্য যোগফল এবং পড়ার সংখ্যা সংগ্রহ করার পরে, গড় গণনা করুন
এর জন্য (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 দিয়ে শেষ , একে একে)
> 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_2013.csv
TAVG_US_2011.csv> 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

সমস্ত রাজ্যের জন্য এক বছরের ডেটা দেখুন (একবারে একটি পৃষ্ঠা আউটপুট দেখার উপযোগিতা কম):

$ কম 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 

আপনার কাছে এখন একটি ফাইল আছে, সমস্ত রাজ্য সহ, সমস্ত বছরের জন্য:

$ 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. টাইম-সিরিজ ডেটা তৈরি করুন

এই ধরনের সমস্যাটি একটি টাইম-সিরিজ মডেল যেমন লং শর্ট-টার্ম মেমরি (LSTM), যা একটি পুনরাবৃত্ত নিউরাল নেটওয়ার্ক (RNN) দিয়ে উপযুক্তভাবে সমাধান করা হয়। এই ইনপুট তথ্য সময় স্লাইস মধ্যে সংগঠিত হয়; 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`
করুন
  # রাজ্যের জন্য সমস্ত তাপমাত্রার মান পান
  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;
    # প্রতিটি টাইমস্লাইসের জন্য
    যখন [ $num_slice -lt $num_slices ]
  do
      # স্লাইস_স্টার্ট থেকে স্লাইস_এন্ড পর্যন্ত এক বার স্লাইস
      স্লাইস_এন্ড=$( ($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:

এর শেষ কয়েকটি লাইন রয়েছে
$ head -3 TIME_VARIANT_TAVG_US_2009-2019.csv
AK,-271.271,-290.057,-300.324,-277.603,-270.36,-293.152,-296,147.274.274,296.274.275-293. ,-158.379,-102.585,-24.9517,-1.7973,15.9597,-5.78231,-33.932,-44.7655,-92.5694,-123.338
AK,-26,320,720,390,390. -292.829,-270.413,-256.674,-241.546,-217.757,-158.379,-102.585,-24.9517,-1.7973,15.9597,-5.7823,15.9597,-5.7823,,-256.2331,-5.7824,32531-2531,-5.7824,31-2531,-5. AK,-300.324,-277.603,-270.36,-293.152,-292.829,-270.413,-256.674,-241.546,-217.757,-158.379,-109,57,-109,5735352-158। 44.7655,-92.5694,-123.338,-130.829,-123.979

$ টেইল -3 TIME_VARIANT_TAVG_US_2009-2019.csv
WY,-76.9167,-6.9167,-2547,-2547,-2541-76. ,-81.5556,-124.769,-137.556,-90.213,-54.1389,-55.9907,-30.9167,-9.59813,7.86916,-1.09259,-13.96916,-1.09259,-13,946,42824-13,947,42832-13.>WY,-66.2315,-45.1944,-27.75,-55.3426,-81.5556,-124.769,-137.556,-90.213,-54.1389,-55.9907,-30,796,1968,-30,796,124.769। 1.09259,-13.9722,-47.5648,-83.5234,-98.2963,-124.694,-142.898,-131.028
WY,-45.1944,-27.75,-45.1944,-27.75,-645.1951-635.275,-651-275,-651-275. 54.1389,-55.9907,-30.9167,-9.59813,7.86916,-1.09259,-13.9722,-47.5648,-83.5234,-98.2963,-124.697,-124.697,8283>-প্রের

যদিও এটি কাজ করে, এটি খুব কার্যকর নয়। এটি অপ্টিমাইজ করা যেতে পারে-আপনি কি চেষ্টা করতে পারেন? আপনি কিভাবে এটি করেছেন নীচের মন্তব্যে রিপোর্ট করুন৷

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

> $TRAIN_DATA
> $TEST_DATA
> $VAL_DATA

`cut -d-এ রাজ্যের জন্য ',' -f1 $FILE | সাজান | uniq`
করুন
  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 $TEST_SET_PERCENT / 100 ))
  VAL_NUM_DATA=$(( $NUM_STATE_DATA - $TRAIN_NUM_DATA - $TEST_NUM_DATA ))

    যদি [ $GEN =="SEQ" ]
  তাহলে
        ইকো "অনুক্রমিক"
        STATE_DATA=`grep $state $FILE`
  elif [ $GEN =="RAN" ]
    তারপর
      ইকো "এলোমেলো"
STATE_DATA=`grep $state $FILE | shuf`
    else
        echo "অজানা ডেটা জেন টাইপ:" $GEN
      প্রস্থান 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" | মাথা -$ থেকে>> $TRAIN_DATA

  # পরীক্ষার সেট
  per=$TEST_SET_PERCENT
  num=$TEST_NUM_DATA; থেকে=$(($ থেকে + 1)); to=$(($from + $num - 1));
    ইকো টেস্ট সেট:$per% $num from=$from to=$to
    echo "$STATE_DATA" | মাথা -$ থেকে | tail -$num>> $TEST_DATA

  # যাচাইকরণ সেট
  per=$VAL_SET_PERCENT
  num=$VAL_NUM_DATA; থেকে=$(($ থেকে + 1)); to=$NUM_STATE_DATA;
    echo Validate সেট:$per% $num from=$from=$to
    echo "$STATE_DATA" | tail -$num>> $VAL_DATA

    echo
সম্পন্ন

এটি ডেটা সেট তৈরি করে যা GEN=SEQ সেট করে ক্রমিক বা এলোমেলো করা যেতে পারে অথবা GEN=RAN স্ক্রিপ্টে, এবং আপনি shuf দিয়ে ডাটা এলোমেলো করতে পারেন।

স্ক্রিপ্ট চালান:

$ ./data_sets.sh
AK:3652
ক্রমিক
ট্রেন সেট:70% 2556 থেকে=1 থেকে=2556
পরীক্ষা সেট:20% 730 থেকে=2557 to=3286
Validate set:10% 366 from=3287 to=3652

...

WY:3352
ক্রমিক
ট্রেন সেট:70% 2346 থেকে=1 থেকে=2346
পরীক্ষা সেট:20% 670 থেকে=2347 থেকে=3016
মূল্যায়ন সেট:10% 336 থেকে=3017 থেকে=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_2019.csv
TRAIN_TIMESLICE202019.csv>

শেলের সাথে ডেটা প্রক্রিয়াকরণ

আপনার পরবর্তী মেশিন লার্নিং প্রকল্পের জন্য যখন আপনাকে প্রচুর পরিমাণে ডেটা প্রক্রিয়া করতে হবে, তখন শেল কমান্ড এবং স্ক্রিপ্ট সম্পর্কে চিন্তা করুন। এটি প্রমাণিত এবং বন্ধুত্বপূর্ণ সম্প্রদায়ের সাথে আপনাকে গাইড করতে এবং সাহায্য করার জন্য ব্যবহার করার জন্য প্রস্তুত৷

এই নিবন্ধটি ডেটা প্রক্রিয়াকরণের জন্য একটি শেল প্রবর্তন করে, এবং স্ক্রিপ্টগুলি সুযোগগুলি প্রদর্শন করে। আরো অনেক কিছু সম্ভব। আপনি এটা এগিয়ে নিতে চান? নীচের মন্তব্যে আমাদের বলুন৷


  1. কিভাবে এক্সেলে একটি ক্লায়েন্ট ডেটাবেস তৈরি করবেন (সহজ পদক্ষেপ সহ)

  2. কিভাবে পিভট টেবিল ডেটা মডেলে গণনা করা ক্ষেত্র তৈরি করবেন

  3. এক্সেলে ডেটা মডেল কীভাবে পরিচালনা করবেন (সহজ পদক্ষেপ সহ)

  4. কিভাবে এক্সেলে একটি ডেটা মডেল তৈরি করবেন (3টি সহজ উপায়)