Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Tutorial: Membangun model regresi
Dalam tutorial ini, Anda menggunakan Amazon Redshift MLuntuk membuat model regresi pembelajaran mesin dan menjalankan kueri prediksi pada model. Model regresi memungkinkan Anda memprediksi hasil numerik, seperti harga rumah, atau berapa banyak orang yang akan menggunakan layanan penyewaan sepeda kota. Anda menggunakan perintah CREATE MODEL di Amazon Redshift dengan data pelatihan Anda. Kemudian, Amazon Redshift ML mengkompilasi model, mengimpor model terlatih ke Redshift, dan menyiapkan fungsi prediksi SQL. Anda dapat menggunakan fungsi prediksi dalam kueri SQL di Amazon Redshift.
Dalam tutorial ini, Anda akan menggunakan Amazon Redshift MLuntuk membangun model regresi yang memprediksi jumlah orang yang menggunakan layanan berbagi sepeda kota Toronto pada jam tertentu dalam sehari. Input untuk model termasuk hari libur dan kondisi cuaca. Anda akan menggunakan model regresi, karena Anda menginginkan hasil numerik untuk masalah ini.
Anda dapat menggunakan perintah CREATE MODEL untuk mengekspor data pelatihan, melatih model, dan membuat model tersedia di Amazon Redshift sebagai fungsi SQL. Gunakan operasi CREATE MODEL untuk menentukan data pelatihan baik sebagai tabel atau pernyataan SELECT.
Contoh kasus penggunaan
Anda dapat memecahkan masalah regresi lainnya dengan Amazon Redshift ML, seperti memprediksi nilai seumur hidup pelanggan. Anda juga dapat menggunakan Redshift ML untuk memprediksi harga yang paling menguntungkan dan pendapatan yang dihasilkan dari suatu produk.
Tugas
-
Prasyarat
-
Langkah 1: Muat data dari Amazon S3 ke Amazon Redshift
-
Langkah 2: Buat model pembelajaran mesin
-
Langkah 3: Validasi model
Prasyarat
Untuk menyelesaikan tutorial ini, Anda harus menyelesaikan pengaturan Administratif untuk Amazon Redshift Ml.
Langkah 1: Muat data dari Amazon S3 ke Amazon Redshift
Gunakan editor kueri Amazon Redshift v2 untuk menjalankan kueri berikut.
-
Anda harus membuat tiga tabel untuk memuat tiga kumpulan data publik ke Amazon Redshift. Kumpulan data tersebut adalah Data Pengendara Sepeda Toronto, data
cuaca historis, dan data liburan historis . Jalankan kueri berikut di editor kueri Amazon Redshift untuk membuat tabel bernama ridership
,weather
, dan.holiday
CREATE TABLE IF NOT EXISTS ridership ( trip_id INT, trip_duration_seconds INT, trip_start_time timestamp, trip_stop_time timestamp, from_station_name VARCHAR(50), to_station_name VARCHAR(50), from_station_id SMALLINT, to_station_id SMALLINT, user_type VARCHAR(20) ); CREATE TABLE IF NOT EXISTS weather ( longitude_x DECIMAL(5, 2), latitude_y DECIMAL(5, 2), station_name VARCHAR(20), climate_id BIGINT, datetime_utc TIMESTAMP, weather_year SMALLINT, weather_month SMALLINT, weather_day SMALLINT, time_utc VARCHAR(5), temp_c DECIMAL(5, 2), temp_flag VARCHAR(1), dew_point_temp_c DECIMAL(5, 2), dew_point_temp_flag VARCHAR(1), rel_hum SMALLINT, rel_hum_flag VARCHAR(1), precip_amount_mm DECIMAL(5, 2), precip_amount_flag VARCHAR(1), wind_dir_10s_deg VARCHAR(10), wind_dir_flag VARCHAR(1), wind_spd_kmh VARCHAR(10), wind_spd_flag VARCHAR(1), visibility_km VARCHAR(10), visibility_flag VARCHAR(1), stn_press_kpa DECIMAL(5, 2), stn_press_flag VARCHAR(1), hmdx SMALLINT, hmdx_flag VARCHAR(1), wind_chill VARCHAR(10), wind_chill_flag VARCHAR(1), weather VARCHAR(10) ); CREATE TABLE IF NOT EXISTS holiday (holiday_date DATE, description VARCHAR(100));
-
Kueri berikut memuat data sampel ke dalam tabel yang Anda buat pada langkah sebelumnya.
COPY ridership FROM 's3://redshift-ml-bikesharing-data/bike-sharing-data/ridership/' IAM_ROLE default FORMAT CSV IGNOREHEADER 1 DATEFORMAT 'auto' TIMEFORMAT 'auto' REGION 'us-west-2' gzip; COPY weather FROM 's3://redshift-ml-bikesharing-data/bike-sharing-data/weather/' IAM_ROLE default FORMAT csv IGNOREHEADER 1 DATEFORMAT 'auto' TIMEFORMAT 'auto' REGION 'us-west-2' gzip; COPY holiday FROM 's3://redshift-ml-bikesharing-data/bike-sharing-data/holiday/' IAM_ROLE default FORMAT csv IGNOREHEADER 1 DATEFORMAT 'auto' TIMEFORMAT 'auto' REGION 'us-west-2' gzip;
-
Kueri berikut melakukan transformasi pada
weather
kumpulan dataridership
dan untuk menghilangkan bias atau anomali. Menghapus bias dan anomali menghasilkan peningkatan akurasi model. Query menyederhanakan tabel dengan membuat dua tampilan baru yang disebutridership_view
danweather_view
.CREATE OR REPLACE VIEW ridership_view AS SELECT trip_time, trip_count, TO_CHAR(trip_time, 'hh24') :: INT trip_hour, TO_CHAR(trip_time, 'dd') :: INT trip_day, TO_CHAR(trip_time, 'mm') :: INT trip_month, TO_CHAR(trip_time, 'yy') :: INT trip_year, TO_CHAR(trip_time, 'q') :: INT trip_quarter, TO_CHAR(trip_time, 'w') :: INT trip_month_week, TO_CHAR(trip_time, 'd') :: INT trip_week_day FROM ( SELECT CASE WHEN TRUNC(r.trip_start_time) < '2017-07-01' :: DATE THEN CONVERT_TIMEZONE( 'US/Eastern', DATE_TRUNC('hour', r.trip_start_time) ) ELSE DATE_TRUNC('hour', r.trip_start_time) END trip_time, COUNT(1) trip_count FROM ridership r WHERE r.trip_duration_seconds BETWEEN 60 AND 60 * 60 * 24 GROUP BY 1 ); CREATE OR REPLACE VIEW weather_view AS SELECT CONVERT_TIMEZONE( 'US/Eastern', DATE_TRUNC('hour', datetime_utc) ) daytime, ROUND(AVG(temp_c)) temp_c, ROUND(AVG(precip_amount_mm)) precip_amount_mm FROM weather GROUP BY 1;
-
Query berikut membuat tabel yang menggabungkan semua atribut input yang relevan dari
ridership_view
danweather_view
ke dalamtrip_data
tabel.CREATE TABLE trip_data AS SELECT r.trip_time, r.trip_count, r.trip_hour, r.trip_day, r.trip_month, r.trip_year, r.trip_quarter, r.trip_month_week, r.trip_week_day, w.temp_c, w.precip_amount_mm,CASE WHEN h.holiday_date IS NOT NULL THEN 1 WHEN TO_CHAR(r.trip_time, 'D') :: INT IN (1, 7) THEN 1 ELSE 0 END is_holiday, ROW_NUMBER() OVER ( ORDER BY RANDOM() ) serial_number FROM ridership_view r JOIN weather_view w ON (r.trip_time = w.daytime) LEFT OUTER JOIN holiday h ON (TRUNC(r.trip_time) = h.holiday_date);
Lihat data sampel (opsional)
Kueri berikut menunjukkan entri dari tabel. Anda dapat menjalankan operasi ini untuk memastikan tabel dibuat dengan benar.
SELECT * FROM trip_data LIMIT 5;
Berikut ini adalah contoh output dari operasi sebelumnya.
+---------------------+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+ | trip_time | trip_count | trip_hour | trip_day | trip_month | trip_year | trip_quarter | trip_month_week | trip_week_day | temp_c | precip_amount_mm | is_holiday | serial_number | +---------------------+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+ | 2017-03-21 22:00:00 | 47 | 22 | 21 | 3 | 17 | 1 | 3 | 3 | 1 | 0 | 0 | 1 | | 2018-05-04 01:00:00 | 19 | 1 | 4 | 5 | 18 | 2 | 1 | 6 | 12 | 0 | 0 | 3 | | 2018-01-11 10:00:00 | 93 | 10 | 11 | 1 | 18 | 1 | 2 | 5 | 9 | 0 | 0 | 5 | | 2017-10-28 04:00:00 | 20 | 4 | 28 | 10 | 17 | 4 | 4 | 7 | 11 | 0 | 1 | 7 | | 2017-12-31 21:00:00 | 11 | 21 | 31 | 12 | 17 | 4 | 5 | 1 | -15 | 0 | 1 | 9 | +---------------------+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+
Tampilkan korelasi antara atribut (opsional)
Menentukan korelasi membantu Anda mengukur kekuatan asosiasi antar atribut. Tingkat asosiasi dapat membantu Anda menentukan apa yang mempengaruhi output target Anda. Dalam tutorial ini, target output adalahtrip_count
.
Query berikut membuat atau menggantikan sp_correlation
prosedur. Anda menggunakan prosedur tersimpan yang dipanggil sp_correlation
untuk menunjukkan korelasi antara atribut dan atribut lainnya dalam tabel di Amazon Redshift.
CREATE OR REPLACE PROCEDURE sp_correlation(source_schema_name in varchar(255), source_table_name in varchar(255), target_column_name in varchar(255), output_temp_table_name inout varchar(255)) AS $$ DECLARE v_sql varchar(max); v_generated_sql varchar(max); v_source_schema_name varchar(255)=lower(source_schema_name); v_source_table_name varchar(255)=lower(source_table_name); v_target_column_name varchar(255)=lower(target_column_name); BEGIN EXECUTE 'DROP TABLE IF EXISTS ' || output_temp_table_name; v_sql = ' SELECT ''CREATE temp table '|| output_temp_table_name||' AS SELECT ''|| outer_calculation|| '' FROM (SELECT COUNT(1) number_of_items, SUM('||v_target_column_name||') sum_target, SUM(POW('||v_target_column_name||',2)) sum_square_target, POW(SUM('||v_target_column_name||'),2) square_sum_target,''|| inner_calculation|| '' FROM (SELECT ''|| column_name|| '' FROM '||v_source_table_name||'))'' FROM ( SELECT DISTINCT LISTAGG(outer_calculation,'','') OVER () outer_calculation ,LISTAGG(inner_calculation,'','') OVER () inner_calculation ,LISTAGG(column_name,'','') OVER () column_name FROM ( SELECT CASE WHEN atttypid=16 THEN ''DECODE(''||column_name||'',true,1,0)'' ELSE column_name END column_name ,atttypid ,''CAST(DECODE(number_of_items * sum_square_''||rn||'' - square_sum_''||rn||'',0,null,(number_of_items*sum_target_''||rn||'' - sum_target * sum_''||rn|| '')/SQRT((number_of_items * sum_square_target - square_sum_target) * (number_of_items * sum_square_''||rn|| '' - square_sum_''||rn||''))) AS numeric(5,2)) ''||column_name outer_calculation ,''sum(''||column_name||'') sum_''||rn||'',''|| ''SUM(trip_count*''||column_name||'') sum_target_''||rn||'',''|| ''SUM(POW(''||column_name||'',2)) sum_square_''||rn||'',''|| ''POW(SUM(''||column_name||''),2) square_sum_''||rn inner_calculation FROM ( SELECT row_number() OVER (order by a.attnum) rn ,a.attname::VARCHAR column_name ,a.atttypid FROM pg_namespace AS n INNER JOIN pg_class AS c ON n.oid = c.relnamespace INNER JOIN pg_attribute AS a ON c.oid = a.attrelid WHERE a.attnum > 0 AND n.nspname = '''||v_source_schema_name||''' AND c.relname = '''||v_source_table_name||''' AND a.atttypid IN (16,20,21,23,700,701,1700) ) ) )'; EXECUTE v_sql INTO v_generated_sql; EXECUTE v_generated_sql; END; $$ LANGUAGE plpgsql;
Kueri berikut menunjukkan korelasi antara kolom target,trip_count
, dan atribut numerik lainnya dalam dataset kami.
call sp_correlation( 'public', 'trip_data', 'trip_count', 'tmp_corr_table' ); SELECT * FROM tmp_corr_table;
Contoh berikut menunjukkan output dari sp_correlation
operasi sebelumnya.
+------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+ | trip_count | trip_hour | trip_day | trip_month | trip_year | trip_quarter | trip_month_week | trip_week_day | temp_c | precip_amount_mm | is_holiday | serial_number | +------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+ | 1 | 0.32 | 0.01 | 0.18 | 0.12 | 0.18 | 0 | 0.02 | 0.53 | -0.07 | -0.13 | 0 | +------------+-----------+----------+------------+-----------+--------------+-----------------+---------------+--------+------------------+------------+---------------+
Langkah 2: Buat model pembelajaran mesin
-
Kueri berikut membagi data Anda menjadi satu set pelatihan dan set validasi dengan menunjuk 80% dari dataset untuk pelatihan dan 20% untuk validasi. Set pelatihan adalah input untuk model ML untuk mengidentifikasi algoritma terbaik untuk model. Setelah model dibuat, Anda menggunakan set validasi untuk memvalidasi akurasi model.
CREATE TABLE training_data AS SELECT trip_count, trip_hour, trip_day, trip_month, trip_year, trip_quarter, trip_month_week, trip_week_day, temp_c, precip_amount_mm, is_holiday FROM trip_data WHERE serial_number > ( SELECT COUNT(1) * 0.2 FROM trip_data ); CREATE TABLE validation_data AS SELECT trip_count, trip_hour, trip_day, trip_month, trip_year, trip_quarter, trip_month_week, trip_week_day, temp_c, precip_amount_mm, is_holiday, trip_time FROM trip_data WHERE serial_number <= ( SELECT COUNT(1) * 0.2 FROM trip_data );
-
Kueri berikut membuat model regresi untuk memprediksi
trip_count
nilai untuk setiap tanggal dan waktu masukan. Dalam contoh berikut, ganti amzn-s3-demo-bucket dengan bucket S3 Anda sendiri.CREATE MODEL predict_rental_count FROM training_data TARGET trip_count FUNCTION predict_rental_count IAM_ROLE default PROBLEM_TYPE regression OBJECTIVE 'mse' SETTINGS ( s3_bucket 'amzn-s3-demo-bucket', s3_garbage_collect off, max_runtime 5000 );
Langkah 3: Validasi model
-
Gunakan kueri berikut untuk menampilkan aspek model, dan temukan metrik kesalahan kuadrat rata-rata dalam output. Mean square error adalah metrik akurasi khas untuk masalah regresi.
show model predict_rental_count;
-
Jalankan kueri prediksi berikut terhadap data validasi untuk membandingkan jumlah perjalanan yang diprediksi dengan jumlah perjalanan yang sebenarnya.
SELECT trip_time, actual_count, predicted_count, (actual_count - predicted_count) difference FROM ( SELECT trip_time, trip_count AS actual_count, PREDICT_RENTAL_COUNT ( trip_hour, trip_day, trip_month, trip_year, trip_quarter, trip_month_week, trip_week_day, temp_c, precip_amount_mm, is_holiday ) predicted_count FROM validation_data ) LIMIT 5;
-
Kueri berikut menghitung kesalahan kuadrat rata-rata dan kesalahan kuadrat rata-rata akar berdasarkan data validasi Anda. Anda menggunakan kesalahan kuadrat rata-rata dan kesalahan kuadrat rata-rata akar untuk mengukur jarak antara target numerik yang diprediksi dan jawaban numerik yang sebenarnya. Model yang baik memiliki skor rendah di kedua metrik. Query berikut mengembalikan nilai kedua metrik.
SELECT ROUND( AVG(POWER((actual_count - predicted_count), 2)), 2 ) mse, ROUND( SQRT(AVG(POWER((actual_count - predicted_count), 2))), 2 ) rmse FROM ( SELECT trip_time, trip_count AS actual_count, PREDICT_RENTAL_COUNT ( trip_hour, trip_day, trip_month, trip_year, trip_quarter, trip_month_week, trip_week_day, temp_c, precip_amount_mm, is_holiday ) predicted_count FROM validation_data );
-
Kueri berikut menghitung persen kesalahan dalam jumlah perjalanan untuk setiap waktu perjalanan pada 2017-01-01. Kueri memesan waktu perjalanan dari waktu dengan kesalahan persen terendah ke waktu dengan kesalahan persen tertinggi.
SELECT trip_time, CAST(ABS(((actual_count - predicted_count) / actual_count)) * 100 AS DECIMAL (7,2)) AS pct_error FROM ( SELECT trip_time, trip_count AS actual_count, PREDICT_RENTAL_COUNT ( trip_hour, trip_day, trip_month, trip_year, trip_quarter, trip_month_week, trip_week_day, temp_c, precip_amount_mm, is_holiday ) predicted_count FROM validation_data ) WHERE trip_time LIKE '2017-01-01 %%:%%:%%' ORDER BY 2 ASC;
Topik terkait
Untuk informasi selengkapnya tentang Amazon Redshift ML, lihat dokumentasi berikut:
Untuk informasi selengkapnya tentang pembelajaran mesin, lihat dokumentasi berikut: