#author("2023-10-18T15:35:49+09:00","default:cmdsadmin","cmdsadmin") #author("2023-10-23T01:23:40+09:00","default:cmdsadmin","cmdsadmin") [[第3回]] * 第3回演習課題 [#w3bb626b] [[課題提出]]のページを熟読したうえで,以下の演習課題に取り組みなさい ** 基礎問題 [#e586be99] ''Q3-1【どのタイプの機械学習?】'' - 次のRQは,以下に示すどの種類の機械学習で解くのが最もふさわしいかを答えなさい. 1: 教師あり学習(分類),2:教師あり学習(回帰),3: 教師なし学習(クラスタリング),4:教師なし学習(次元削減),5:機械学習で解くべき問題ではない - RQ1: ウェアラブルセンサで測定した加速度のデータから,その人が歩いているか,ジャンプしているか,走っているかを求める - RQ2: 救急搬送のデータと気象データから,明日の熱中症の搬送者数を求める - RQ3: 身長と体重のデータから,その人の[[肥満度:https://ja.wikipedia.org/wiki/%E6%97%A5%E6%9C%AC%E8%82%A5%E6%BA%80%E5%AD%A6%E4%BC%9A]]を求める - RQ4: 多数の顧客の購買履歴から,どのような購買層が存在するかを求める - RQ5: 顧客との営業活動データから,その顧客が見込み顧客か否かを求める - RQ6: 国語,数学,社会,理科,英語の5科目の得点から,理系能力,文系能力を表す指標を求める - RQ7: 大きさ,重さ,色,カラット数からダイヤの相場を求める - RQ8: 楽曲データからその楽曲のテンポを求める ** 応用問題 [#a86c4d07] ''Q3-2【迷惑メールをみつけよう】'' - 以下に示すデータを利用し,迷惑メールを検出する機械学習モデルを作成しなさい -- [[【迷惑メール (spam-base) データセット】>データ#u4f884fd]] -- https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/spam-sample.csv 【データの説明】 ・各行が1通のメールに対応し,そのメールから観測された特徴量と正解データを含んでいる ・特徴量は,以下の通り. - (0~53列) 列名にある単語(または文字)の数が,そのメール中のすべての単語(または文字)に占める割合 - (54~56列) メール中で連続する大文字の平均長,最大長,合計長 ・正解データ(ラベル)は57列. 1 (迷惑メール), 0 (迷惑メールではない) - また,以下のコードスケルトンに沿って,Pythonプログラムを作成しなさい.ただし, -- 訓練データとテストデータの比率を60:40になるよう分割しなさい.random_stateは1234とせよ -- 使用する機械学習モデルは,決定木を使用し,木の最大深さは5,random_stateを1234にせよ - コードスケルトン ################### ライブラリのインポート ######################### #いつものPandasとNumPyをインポート import pandas as pd import numpy as np #日本語化MatplotLib import matplotlib.pyplot as plt #↓の1行は提出時にはコメントアウトしてください !pip install japanize-matplotlib import japanize_matplotlib # Seabornをインポート import seaborn as sns # Pickleをインポート import pickle ########################### データの取得 ############################ #迷惑メールデータの取得 spam_data = pd.############################################# ############################## 前処理 ################################ #特徴量に指定する列名リスト.データの列名の0~56をスライスで取得 features = spam_data.columns[##:##] #正解データに指定する列名.データの列名の最後のものをスライスで取得 target = spam_data.columns[##:##] #特徴量 X = spam_data[features] #正解データ y = spam_data[target] #X, yのそれぞれを訓練データとテストデータに分ける (訓練:テスト=60:40) from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(####, ####, #################, random_state=1234) ###################### モデルの選択と学習 ############################# #モデルの選択 from sklearn import tree model = tree.DecisionTreeClassifier(max_depth=####, random_state=1234) #モデルの学習(訓練データを使う) model.#####(#######, ########) #モデルの表示(オプショナル) #tree.plot_tree(model, feature_names=features) #plt.show() ########################### モデルの評価 ############################### #分類精度 acc = model.score(#######, #######) print(f"分類精度: {acc}") #実際にあっているかどうかを確認してみる (オプショナル) y_eval = pd.DataFrame() y_eval["正解"] = y_test[target[0]] y_eval["予測"] = model.#########(#######) y_eval["結果"] = (y_eval["正解"] == y_eval["予測"]) print(y_eval) #混同行列を表示する from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay cm = confusion_matrix(#########, model.##########(########)) print("混同行列:\n", cm) #プロットする(オプショナル) #disp = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=model.classes_) ''Q3-3【不動産価格を推定しよう】'' - 以下に示すデータを利用し,不動産価格(坪単価)を予測する機械学習モデルを作成しなさい -- [[【不動産 (realestate) データセット】>データ#o0b3640c]] -- https://www2.cmds.kobe-u.ac.jp/~masa-n/dshandson/realestate-sample.csv 【データの説明】 ・台湾・新北市の不動産に関するデータセット ・各行が1つの不動産物件に対応し,その物件の特徴量と正解データ(不動産価格)を含んでいる 【データ項目】 0: No: 物件の番号 1: 取引日:年.月日オフセット(1/1を0.0, 12/31を1.0とした,月日の相対値) 2: 築年数: 物件の築年数 3: 駅距離:最寄りの地下鉄駅までの距離(メートル) 4: コンビニ数:徒歩圏内にあるコンビニの数 5: 緯度:物件の場所の緯度 6: 経度:物件の場所の経度 7: 坪単価:物件の1坪(3.3平米)当たりの不動産価格(1万台湾ドル) 【正解データ】 - 以下の指示に従ってPythonプログラムを作成しなさい -- 訓練データとテストデータの比率を60:40になるよう分割しなさい.random_stateは1234とせよ -- 使用する機械学習モデルは,線形回帰を使用しなさい -- モデル構築に使用する特徴量は,No(物件の番号)以外,すべて選びなさい -- 作成したモデルの回帰係数と切片を求め,モデルの説明をしなさい -- 作成したモデルの決定係数を求めなさい -- 作成したモデルの平均絶対誤差を求めなさい -- 上記Q3-3で作成したプログラムのipynbファイルを提出しなさい ** 発展問題 [#saf97b3d] ''Q3-4【モデルをチューニングしてみよう】'' - Q3-3で構築した不動産価格のモデルについて,決定係数を向上させるように改良(チューニング)を行い,レポートにまとめなさい -- チューニングの方法として,例えばデータから外れ値を取り除く,線形回帰モデル以外のモデルを試してみる,などがある -- レポートには,どのような工夫をして,結果的に決定係数がどこまで向上したかを記述しなさい