--- tags: Admin, TA --- # GAI 2024 Project1 Grading Policy (助教) 原作業規範:https://hackmd.io/IRtu9eKpRM2mvfj0abu3vg ## Numpy ### 練習 1:softmax (10) 在學生程式中加入 `np.random.seed(903)` ``` np.random.seed(903) # 設定總共類別 c = 10 # 模擬輸出 logits x = np.random.rand(c) # 計算指數 x_exp = np.exp(x) # 取得 softmax 分母 x_exp_sum = np.sum(x_exp) # 定義機率值維度,儲存 softmax 結果 p = np.zeros_like(x) # 對每個維度計算 softmax for i in range(c): p[i] = x_exp[i] / x_exp_sum # 輸出 logits print(x) # 輸出經過 softmax 後的機率值 print(p) ``` **正確 output 為** ``` [0.66795894 0.79949537 0.04248317 0.38224843 0.86843254 0.29593196 0.04275267 0.21304653 0.72480104 0.13292176] [0.12266666 0.13991108 0.0656275 0.09218156 0.14989637 0.0845585 0.06564519 0.07783243 0.12984127 0.07183943] ``` ### 練習 2:Linear Layer + ReLU Activation (10) **同樣在學生 code 前加入`np.random.seed(903)`** ``` np.random.seed(903) # 設定輸入維度 d_in = 10 # 設定輸出維度 d_out = 30 # 模擬神經網路輸入 x = np.ones((d_in, 1)) # 模擬神經網路權重 W = np.random.rand(d_out, d_in) * 10 - 5 # 模擬神經網路偏差值 b = np.random.rand(d_out, 1) * 10 - 5 # TODO h = W.dot(x) + b # 計算 ReLU 得到神經網路輸出 y = h * (h > 0) # 輸出神經網路輸入 print(x) # 輸出神經網路輸出 print(y) ``` **正確 output 為** ``` [[1.] [1.] [1.] [1.] [1.] [1.] [1.] [1.] [1.] [1.]] [[-0. ] [ 0.94999447] [ 3.88704845] [21.03030551] [-0. ] [12.85518268] [ 5.17560451] [-0. ] [ 5.67361334] [12.88152638] [-0. ] [-0. ] [-0. ] [-0. ] [-0. ] [10.2724664 ] [ 1.02685378] [-0. ] [ 0.24543543] [-0. ] [-0. ] [15.53112718] [-0. ] [ 6.77223105] [-0. ] [-0. ] [-0. ] [10.00265258] [-0. ] [ 9.19881995]] ``` ## pandas ### 練習 1:數值轉換 (10) 資料即已放到雲端[台南站氣象觀測站(467410)資料集](https://drive.google.com/file/d/1Fp6Wp7Ut7SuXnRolt0S5uYqHFKohnP-v/view?usp=sharing),因為沒有要求要放資料所以有可能需要載來用,主要檢查紫外線強度每個等級的出現次數: $$ 低:0~2、中:3~5、高:6~7、甚高:8~10、極高:11+ $$ ``` df = pd.read_csv('./467410-2022-08.csv', skiprows=1) df['強度等級'] = '' df.loc[(df['UVI Max'] <= 2) & (df['UVI Max'] >= 0), '強度等級'] = '低' df.loc[(df['UVI Max'] <= 5) & (df['UVI Max'] >= 3), '強度等級'] = '中' df.loc[(df['UVI Max'] <= 7) & (df['UVI Max'] >= 6), '強度等級'] = '高' df.loc[(df['UVI Max'] <= 10) & (df['UVI Max'] >= 8), '強度等級'] = '甚高' df.loc[(df['UVI Max'] >= 11), '強度等級'] = '極高' #column_to_write = df['強度等級'] df.to_csv('467410.csv', index=False, encoding='utf-16') # print(df) counts = df['強度等級'].value_counts() print(counts) ``` **主要檢查的次數結果** ``` 強度等級 極高 24 甚高 4 高 2 中 1 ``` ### 練習 2:條件篩選 (10) 根據給定的降水量(mm)和降水時數(hour),計算出降水強度(mm/hr),並找出降水強度大於平均強度的日期及其相關資訊 (將整個 row print 出)。 ``` import pandas as pd import numpy as np def print_rows_greater_than(df, column_name, threshold): selected_rows = df[df[column_name] > threshold] print(selected_rows['ObsTime'].values) # for index, row in selected_rows.iterrows(): # print(row) def convert_precp(value): if value == 'T': return 0.0 else: return float(value) df = pd.read_csv('./467410-2022-08.csv', skiprows=1, converters={'Precp': convert_precp, 'PrecpHour': float}) df['降水強度'] = df['Precp']/df['PrecpHour'] average_value = df['降水強度'].mean() column_name = '降水強度' print_rows_greater_than(df, column_name, average_value) #print(df['降水強度']) ``` **主要檢查符合條件的天數是否吻合** ``` [ 2 7 9 10 15 16 17 18] ``` ## matplotlib 此部份主要檢查圖是否符合即可 ### 練習 1:折線圖 (10) 請依照日期畫出氣溫以及雨量的變化,並以折線圖的方式呈現。 ``` import pandas as pd import matplotlib.pyplot as plt def convert_precp(value): if value == 'T': return 0.0 else: return float(value) # 讀取 CSV 檔案 df = pd.read_csv('./467410-2022-08.csv', skiprows=1, converters={'Precp': convert_precp, 'PrecpHour': float}) # 繪製折線圖 plt.figure(figsize=(10, 6)) # 設置圖表大小 plt.plot(df['ObsTime'], df['Temperature'], label='Temperature(C)', marker='o') # 繪製氣溫折線圖 plt.plot(df['ObsTime'], df['Precp'], label='Precp(mm)', marker='o') # 繪製雨量折線圖 # 添加標籤和標題 plt.xlabel('ObsTime') plt.ylabel('Value') plt.title('Temperature and Rainfall Variation') plt.legend() # 顯示圖例 plt.grid(True) # 顯示網格 plt.xticks(rotation=45) # 旋轉 x 軸標籤,以避免重疊 # 顯示圖表 plt.tight_layout() # 調整布局,避免標籤被截斷 plt.show() ``` **主要檢查圖是不是長這樣就好**,有可能會有人兩張圖分開畫,那樣也算對 ![image](https://hackmd.io/_uploads/By-CCZxk0.png) ![image](https://hackmd.io/_uploads/B1zuNHC1C.png) ### 練習 2:雷達圖 (10) 分析風速和風向之間的關係,對於每個風向角度區間(0-90度、90-180度、180-270度、270-360度),計算相應的平均風速,並繪製成雷達圖以可視化四種風向的風速分佈情況。 ``` import pandas as pd import numpy as np import matplotlib.pyplot as plt # 讀取 CSV 檔案 df = pd.read_csv('./467410-2022-08.csv', skiprows=1) # 將風向轉換為數值,例如 0 度表示北風,90 度表示東風,以此類推 # 假設風向存儲在 'WindDirection' 欄位中,風速存儲在 'WindSpeed' 欄位中 # 這裡的角度從 0 到 360 度 # 如果您的角度從 -180 到 180 度,請將角度調整為 0 到 360 度 # 將風向轉換為弧度 df['WindDirection_rad'] = np.deg2rad(df['WD']) # 將風向角度劃分為四個區間:0-90度、90-180度、180-270度、270-360度 bins = [0, np.pi / 2, np.pi, 3 * np.pi / 2, 2 * np.pi] labels = ['0-90 degrees', '90-180 degrees', '180-270 degrees', '270-360 degrees'] df['WindDirection_interval'] = pd.cut(df['WindDirection_rad'], bins=bins, labels=labels) # 分別計算每個區間內的平均風速 avg_wind_speed = df.groupby('WindDirection_interval')['WS'].mean() print(avg_wind_speed) # (2.0 2.6 2.4222222222222225 2.4714285714285715) # 繪製雷達圖 angles = np.linspace(0, 2 * np.pi, len(labels), endpoint=False).tolist() fig, ax = plt.subplots(figsize=(6, 6), subplot_kw=dict(polar=True)) ax.fill(angles, avg_wind_speed, color='blue', alpha=0.25) ax.plot(angles, avg_wind_speed, color='blue', linewidth=2, linestyle='solid') ax.set_yticklabels([]) # 隱藏半徑標籤 ax.set_theta_zero_location('N') # 將北方設置為起始位置 ax.set_theta_direction(-1) # 順時針方向 plt.title('Average Wind Speed by Wind Direction', size=20, color='blue') plt.show() ``` **主要檢查是否與下列數值相同(圖相似即可)** Actual avg wind_speed (>min & <=max) = [2.0 2.6 2.4222222222222225 2.4714285714285715] Actual avg wind_speed (>=min & <max) = [2.0, 2.175, 2.66, 2.483333333333333] ![image](https://hackmd.io/_uploads/HyEI1GlJ0.png) ## scikit-learn 1. <font color="blue">關使用 sklearn.model_selection.train_test_split 將 train.csv 分割,參數請設置成:train_size=0.8, random_state=1012,以分割後的 test_data 做最終預測結果的分析基準</font> 2. 分割後 test acc 預測原始分數為:<font color="red">0.7262</font>,請改進到超越此分數 未符合 1. 則直接在 rules 中扣除 20 ### 練習 1:改善決策樹分類模型 [10pts] 檢查改進後 test acc 是否超過 0.762,未滿足則看完成度扣分 ### 練習 2:使用不同的模型 [10pts] 檢查是否使用兩種以上模型,任一 test acc 是否超過 0.762,未滿足則看完成度扣分 ## Report - The way to improve [10pts] 說明對哪個部分進行改進,解釋方法與前後結果差異 - Different model comparison [10pts] 測試不同模型的訓練結果,至少兩種以上。