ช่วงนี้กระแส ChatGPT มาแรงมาก เป็น AI chatbot ที่มีความฉลาด เป็นเสมือนที่ปรึกษาส่วนตัว ผมเริ่มสนใจมันตั้งแต่ที่ลูกมาปรึกษาปัญหาเกี่ยวกับการบ้านที่ต้องเขียนเกมส์บน Python มันเป็นเกมส์สำหรับหลบหลีกสิ่งกีดขวางบนหน้าจอ โดยคุณครูให้โครงของ Class กับ Function มาแล้วก็ให้นักเรียนเขียน coding ให้เกมส์มันทำตามที่ครูเขียน comment ไว้ให้ ว่าต้องการให้นักเรียนเขียน code ที่ขาดหายไปในแต่ละ Function ให้สมบูรณ์ถ้า program เขียนถูกต้องก็จะทำให้เกมส์เล่นได้ ผมเห็นแล้วก็งงมากเลยว่าทำไมการบ้านเด็กมันยากจัง เลยบอกไปตรงๆว่าทำไม่ได้ คงต้องให้ลูกไปทำกับเพื่อนๆ หรือปรึกษาครูแล้วหละ

อาทิตย์ถัดมาตอนกินข้าวเย็นด้วยกันก็เลยถามลูกว่าตกลงเขียนโปรแกรมเสร็จไหม ลูกตอบว่าเสร็จเรียบร้อยดีส่งไปแล้วได้คะแนนเต็มด้วย ผมเลยถามกลับไปว่าทำยังไง ได้ถามครูไหมเพราะมันยากมากเลยนะ ลูกผมตอบว่าไม่ได้ถามครู แต่ถาม ChatGPT เอา แล้วก็ copy & paste เอา ผมเลยทึ่งกับนักเรียนสมัยนี้มาก แล้วบอกกลับไปว่ายังไงต้องทำความเข้าใจกับโปรแกรมที่ AI มันแนะนำมาด้วยนะ เพราะเวลาสอบเราไม่ได้มี bot มาช่วยเขียนแบบนี้
จากนั้นมาผมก็เริ่มสนใจ ChatGPT ประกอบกับมีข่าวดังเกี่ยวกับ AI ตัวนี้เพิ่มมากขึ้น อาทิตย์ถัดมาเลย ลองไปเล่นดู ใช้งานง่ายมาก เป็นเหมือน Chatbot ทั่วไปพิมพ์ถามอะไรก็ได้ สักพัก bot มันก็จะตอบกับมา มันไม่เหมือน Google ที่เป็นโปรแกรมแบบ key word search คือพิมพ์ไปแล้ว Google จะค้นบทความบนอินเทอร์เนตที่มี key word ตามที่เราพิมพ์ออกมาให้เลือก แต่ ChatGPT มันจะตอบมาข้อความเดียวเหมือนเราคุย Line กับเพื่อน ถ้าคำตอบไม่ตรงกับที่เราคิดเอาไว้ ก็ให้มัน สร้างคำตอบใหม่ได้
ตอนนี้ ChatGPT เปิดให้ทดลองใช้งานฟรีอยู่เพื่อปรับปรุงให้มีประสิทธิภาพดีขึ้น ผลจากการทดลองเล่นพบว่า
- มันไม่สามารถทำนายเหตุการณ์ในอนาคตได้
- มันเข้าใจภาษาไทยแต่ตอบกลับช้าและก็หยุดในขณะที่ยังตอบไม่เสร็จดี
- มันแสดงได้แต่คำตอบที่เป็น text base ไม่สามารถแสดงเป็นรูปภาพได้
- มันสามารถแนะนำและให้คำปรึกษาได้ในทุกๆเรื่อง ไม่ว่าจะเป็นเรื่องส่วนตัว การใช้ชีวิต แม้กระทั่งวิธีการทำงาน หรือหาข้อมูลเกี่ยวกับงานที่เรากำลังติดปัญหาอยู่ เหมือนที่ลูกผมให้มันช่วยทำการบ้าน
- สิ่งที่มันเก่งจริงๆเลยคือการเขียนโปรแกรม และแนะนำการทำให้โปรแกรมที่เราเขียนทำงานได้ดียิ่งขึ้น แต่ยังมีข้อผิดพลาดเหมือนกัน
หลังจากลองเล่นมาหลายๆแบบ ผมก็ลองเอาโปรแกรมทำนายราคาเหรียญคริปโตที่เขียนบน Python ในบทความ AI Prophet Part 1 ส่งไปให้ ChatGPT comment ดู มันก็อธิบายโปรแกรมของผมออกมาที่ละฉากเลย น่าทึ่งมาก
ผมเลยถาม ChatGPT ต่อไปว่าโปรแกรมผมมันทายไม่ค่อยแม่น มีวิธีไหนบ้างที่จะทำให้มันทำนายราคาได้แม่นยำขึ้น คำตอบเบื้องต้นคือ ส่งข้อมูลราคาในอดีตให้ยาวนานขึ้น AI จะได้จับ pattern ต่างๆได้มากขึ้น แต่คำแนะนำถัดไปนี่ผมถือว่าสุดยอดเลย เจ้า ChatGPT บอกว่าการทำนายราคาไม่จำเป็นต้องใช้ LSTM แบบ sequential model ก็ได้นะ ทำไมไม่ลองวิธีอื่นดูบ้าง ผมเลยถามต่อไปว่ามีวิธีไหนแนะนำบ้าง เจ้า ChatGPT ก็แนะนำมา 2-3 วิธี ที่ผมไม่เคยรู้จักเลย และไม่รู้ด้วยซ้ำว่าจะเรียกใช้ model เหล่านี้ยังไง ผมเลยจิ้มเลือกหนึ่งใน model ที่เจ้า ChatGPT แนะนำมาคือ GradientBoostingRegressor ซึ่งเจ้า AI บอกว่า ถึงแม้วิธีนี้จะเป็น model แบบ 2D array (ไม่เหมือน 3D array ที่ผมใช้กับ LSTM ก่อนหน้า) แต่ถ้าปรับแต่ง parameter โดยใช้ grid search ช่วยปรับแต่ง parameter ที่ดีที่สุดให้ น่าจะแม่นยำกว่าโปรแกรมปัจจุบัน ข้างล่างคือสิ่งที่มันบอกว่าจะใช้
The
GridSearchCV()function is used to perform a grid search over the specified hyperparameter values for the gradient boosting regressor model. Thescoringparameter is set to'neg_mean_squared_error'to optimize for mean squared error, and thecvparameter is set to 5 to perform 5-fold cross-validation. The grid search will fit the model with each combination of hyperparameter values and evaluate the model using cross-validation.Once the grid search is complete, the best hyperparameters are obtained using the
best_params_attribute of thegsobject and used to train the final model using these hyperparameters. The model is then fit to the training data using thefit()method.
ยิ่งฟังยิ่งงง เอาเป็นว่างั้น ChatGPT เขียนมาให้ดูหน่อยว่าที่พูดมาหน้าตาเป็นยังไง เฮ้ย! มันเขียน coding กลับมาให้จริงๆด้วย แต่ code ที่ ChatGPT เขียนให้กลับมา ทำให้ผมพบว่า ChatGPT เวอร์ชั่นปัจจุบันยังไม่สามารถเขียนโปรแกรมยาวๆตอบกลับมาได้อย่างสมบูรณ์ หรือยังมีบัคอยู่มันเลยส่งมาสักประมาณ 40 กว่า lines ก็หยุดไปเฉยๆ ผมเลยต้องเอามาตัดแปะใส่โปรแกรมของผมเองแล้วก็ส่งให้ ChatGPT ช่วยรีวิว แก้ไปมาจนเสร็จ ได้โปรแกรมทำนายราคาเหรียญที่ ChatGPT เคลมเอาไว้ว่าแม่นยำกว่าของผม ต้องลองสักหน่อยแล้ว
สิ่งที่ค้นพบอีกอย่างคือ ChatGPT ไม่ได้คำนึงถึงศักยภาพของคอมพิวเตอร์ที่จะนำมารัน algorithm ที่มันสร้างขึ้น ผมลองใช้ Spyder รัน Python script ที่ ChatGPT แนะนำบน notebook ผม การโหลดข้อมูลราคาเก่าตั้งแต่ต้นปี 2015 – 2022 ไม่มีปัญหา ขั้นตอนถัดไปคือการนำข้อมูลที่ได้มา ไปใช้ในการ ค้นหา parameter ที่ดีที่สุดในการใช้ร่วมกับ GradientBoostingRegressor model ที่ ChatGPT คุยนักหนาว่าแม่นกว่า โปรแกรมส่วนนี้รันนานจนไม่แน่ใจว่าโปรแกรมตายไปรึเปล่า บางครั้งทิ้งเครื่องให้รันยาวๆข้ามคืนก็ไม่เสร็จ ต้องลดขนาดข้อมูลลง เลยไม่แน่ใจว่าจะยังแม่นอยู่ไหม สุดท้ายก็ให้มันแนะนำ parameter ให้เลยเพื่อไปต่อได้ตามที่เห็นข้างล่าง คงได้แค่เชื่อว่ามันต้องแม่นกว่าโปรแกรมเก่าของเราแน่ๆ เพราะ ChatGPT ออกจะฉลาด 555
ตอนนี้โปรแกรมข้างล่างยังติดปัญหาเล็กๆอย่างหนึ่ง คือโปรแกรมให้อ่านราคาจาก Yahoo finance มาเป็น text Series แต่ predict model ต้องการค่าเป็นแบบ array ดูเหมือนว่า ChatGPT จะไม่เข้าใจและเถียงผมหัวชนฝาเลยว่าโปรแกรมถูกต้องแล้ว ใครอยากเอาไปลองเล่นดูบ้างสามารถ copy source code ข้างล่างนี้ไปลองใช้ดูได้เลยครับ ผมให้เป็นของขวัญปีใหม่ 2023 ถ้าใช้ข้อมูลตั้งแต่ปี 2015 ตามที่ ChatGPT แนะนำและได้ best fit parameter ออกมาสำเร็จ ผลทำนายได้แม่นยำอย่างไรมาเล่าสู่กันฟังดู โดยเทียบกับเหตุการณ์ที่เกิดขึ้นจริงว่าทำนายราคาแม่นแค่ไหน ผมไม่หวง code เอาไปใช้เลย แบ่งๆกันรวย แต่อย่า all in นะครับ เพราะมันเป็นเพียงแค่คำทำนาย ChatGPT เป็นแค่คนช่วยสร้างขึ้นมาด้วยหลักสถิติแต่ AI ตัวนี้ไม่ได้เป็นหมอดูแล้วก็ออกตัวตั้งแต่คำถามแรกที่ผมถามไปแล้วว่าเค้าไม่สามารถทำนายอนาคตได้ เอาเหอะ ใช้ประกอบการตัดสินใจลงทุน รวยแล้วก็อย่าลืมกันนะ
import numpy as np
import matplotlib.pyplot as plt
from pandas.tseries.offsets import DateOffset
import pandas as pd
import pandas_datareader as web
import datetime as dt
import yfinance as yf
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import GridSearchCV, train_test_split
import matplotlib.dates as mdates
# Use more data by increasing the range of the start date
ticker = yf.Ticker("LINK-USD")
data = ticker.history(start='2015-01-01', end='2023-01-07')
# Print the last 5 rows of the data to see what it looks like
print(data.tail())
# Set the number of days to use for each prediction
prediction_days = 10
# Initialize the lists that will hold the training data
X_train, y_train = [], []
# Use the "Close" column of the data
data = data["Close"]
# Iterate over the data and create the training data
for i in range(len(data)-prediction_days):
x = data[i:i+prediction_days]
y = data[i+prediction_days]
X_train.append(x)
y_train.append(y)
# Convert the training data to numpy arrays
hist = np.array(X_train)
target = np.array(y_train)
# Set the hyperparameters for the model
param_grid = {'learning_rate': [0.1, 0.05, 0.02, 0.01],
'max_depth': [4, 6],
'min_samples_leaf': [3, 5, 9, 17],
'max_features': [1.0, 0.3, 0.1]}
# Create a grid search object to find the best hyperparameters
gs = GridSearchCV(estimator=GradientBoostingRegressor(n_estimators=1000),
param_grid=param_grid,
scoring='neg_mean_squared_error',
cv=5,
n_jobs=1,
verbose=1)
# Fit the grid search object to the training data
gs.fit(hist, target)
# Use the best hyperparameters to create a new model
model = GradientBoostingRegressor(**gs.best_params_)
# Split the data into a training set and a validation set
X_train, X_test, y_train, y_test = train_test_split(hist, target, test_size=0.2)
# Fit the model to the training data
model.fit(X_train, y_train)
# Make predictions on a sequence of future dates
num_predictions = 15
last_date = data.index[-1]
prediction_dates = pd.date_range(start=last_date, periods=num_predictions, freq='D')
# Create a list to store the predicted values
predictions = []
for prediction_date in prediction_dates:
start_date = prediction_date - DateOffset(days=prediction_days)
mask = (data.index > start_date) & (data.index <= prediction_date)
data_for_p = data.loc[mask]
data_for_pre = data_for_p.values
print(data_for_pre)
print(data_for_pre.shape)
data_for_prediction = data_for_pre.values.reshape(1, prediction_days)
print(data_for_prediction)
prediction = model.predict(data_for_prediction)
predictions.append(prediction[0])
# Plot the predictions
plt.plot(prediction_dates, predictions, color='blue', label='Prediction')
# Set the x-axis tick labels to dates
plt.gca().xaxis.set_major_formatter(mdates.DateFormatter('%Y-%m-%d'))
plt.xlabel('Date')
plt.ylabel('Value')
plt.legend()
plt.show()