#author("2025-02-14T09:46:24+01:00","","") #author("2025-02-14T12:49:38+01:00","","") [[FrontPage]] **[[研究会(中島)]] [#ff48cd7f] **[[専門ゼミ(中島)]] [#gb01032d] **[[引き継ぎ(中島)]] [#cb01032d] **[[メモ(中島)]] [#df86dbb3] **[[中間発表(中島)]] [#df86dbb3] **[[中間発表システムまとめ(中島)]] [#rb970c3e] **[[本論(中島)]] [#c16a5fa2] *B3 前期授業スケジュール [#m14e8d68] |>|>|>|>|>|CENTER:COLOR(white):BGCOLOR(blue):|c ||&size(13){月曜日};|&size(13){火曜日};|&size(13){水曜日};|&size(13){木曜日};|&size(13){金曜日};| |BGCOLOR(#5c5c5c):COLOR(white):|>|>|>|>|COLOR(white):BGCOLOR(white):CENTER:60|c |BGCOLOR(#999999):COLOR(white):|>|>|>|>|COLOR(white):BGCOLOR(white):CENTER:60|c |CENTER:&size(20){1-2};|||||BGCOLOR(#0000ff):&size(10){研究会};| |CENTER:&size(20){3-4};||BGCOLOR(#ff0000):&size(10){卒論1};|||BGCOLOR(#0000ff):&size(10){研究会};| |CENTER:&size(20){5-6};|BGCOLOR(#ff0000):&size(10){卒論1};|BGCOLOR(#006400):&size(10){ディジタル信号処理};|BGCOLOR(#ff0000):&size(10){卒論1};|BGCOLOR(#ff0000):&size(10){卒論1};|| |CENTER:&size(20){7-8};|||||BGCOLOR(#006400):&size(10){技術者倫理};| |CENTER:&size(20){9-10};||BGCOLOR(#0000ff):&size(10){研究会};||BGCOLOR(#006400):&size(10)&ref(中島/ダッシュストーム.jpg,90%);|| |CENTER:&size(20){11-12};|||||| &ref(中島/ダッシュストーム.jpg,45%); &ref(中島/ダッシュストーム.jpg,45%); &ref(中島/ダッシュストーム.jpg,45%); &ref(中島/ダッシュストーム.jpg,45%); &ref(中島/ダッシュストーム.jpg,45%); &ref(中島/ダッシュストーム.jpg,45%); &ref(中島/栗松.jpg,20%); &ref(中島/栗松.jpg,20%); &ref(中島/栗松.jpg,20%); &ref(中島/栗松.jpg,20%); &ref(中島/栗松.jpg,20%); &ref(中島/栗松.jpg,20%); &color(,#000000){'' '''&color(#FFFFFF){メモ};''' ''}; #memo(離散選択モデル 支払い意思 どんな条件があれば他の条件よりもお金を払えるか\n\nヘドニックアプローチ 価格に影響を与える要因を分析する\n\n離散選択モデル どのような属性の組み合わせが消費者に選ばれやすいのかを分析。 価格だけでなく、消費者選好の観点から選択確率を考慮することが可能\n\n交絡因子の影響を排除することはできない。\n\n→操作変数法を利用することで、未観測の交絡因子が存在しても、対象の要因・効果を推定する方法。\n\nどのような消費者がある属性に対して強い選好を持っているか\n\n→構造推定\n\n3.3限界支払い意思額\n\n変数選択法 種類\n全探索法\n\n逐次選択法\n(前進選択法\n後退選択法\nステップワイズ選択法)\n\n正則化法\n(リッジ回帰\nラッソ回帰\nElastic Net)\n\n相関分析\n主成分分析\nboruta法\nAIC/BICの最小化\n\n\nimport pandas as pd\n\n# CSVファイルを読み込む\nfile_path = r"C:\Users\tn011\Downloads\富山取引のほう 富山市のみ 2\富山取引のほう 富山市のみ\df_housing_toyamacity.csv"\ndf = pd.read_csv(file_path)\n\n# 元号から西暦への変換関数\ndef convert_gengo_to_seireki(gengo_year):\n if '令和' in gengo_year:\n year = int(gengo_year.replace('令和', ''))\n return 2018 + year # 令和は2019年から\n elif '平成' in gengo_year:\n year = int(gengo_year.replace('平成', ''))\n return 1988 + year # 平成は1989年から\n elif '昭和' in gengo_year:\n year = int(gengo_year.replace('昭和', ''))\n return 1925 + year # 昭和は1926年から\n elif '大正' in gengo_year:\n year = int(gengo_year.replace('大正', ''))\n return 1911 + year # 大正は1912年から\n elif '明治' in gengo_year:\n year = int(gengo_year.replace('明治', ''))\n return 1867 + year # 明治は1868年から\n else:\n return None # 元号が認識できない場合\n\n# 例: '元号'という列が元号を含むと仮定\nif '元号' in df.columns:\n df['西暦'] = df['元号'].apply(convert_gengo_to_seireki)\n\n# 変換結果をCSVとして保存\noutput_path = r"C:\Users\tn011\Downloads\富山取引のほう 富山市のみ 2\富山取引のほう 富山市のみ\df_housing_toyamacity_with_seireki.csv"\ndf.to_csv(output_path, index=False)\n\n\n\nimport numbers\nimport warnings\n\nimport cvxpy\nimport numpy as np\nfrom asgl import ASGL\nfrom sklearn.base import MultiOutputMixin\nfrom sklearn.base import RegressorMixin\nfrom sklearn.exceptions import ConvergenceWarning\nfrom sklearn.linear_model import ElasticNet\nfrom sklearn.linear_model._coordinate_descent import _alpha_grid\nfrom sklearn.utils import check_X_y\nfrom sklearn.utils.validation import check_is_fitted\n\n\n\nclass AdaptiveElasticNet(ASGL, ElasticNet, MultiOutputMixin, RegressorMixin):\n """\n Objective function and parameters as described with modifications\n to allow alpha1, alpha2, l1_ratio1, and l1_ratio2 customization.\n """\n\n def __init__(\n self,\n alpha1=0.021544346900318846, # First-stage ElasticNet alpha\n alpha2=0.0009443498043343188, # Second-stage ElasticNet alpha\n *,\n l1_ratio1=0.8889, # First-stage ElasticNet L1 ratio\n l1_ratio2=0.778, # Second-stage ElasticNet L1 ratio\n gamma=0.5, # Weight adjustment exponent\n fit_intercept=True,\n precompute=False,\n max_iter=10000,\n copy_X=True,\n solver=None,\n tol=None,\n positive=False,\n positive_tol=1e-3,\n random_state=None,\n eps_coef=1e-6,\n verbose=True\n ):\n params_asgl = dict(model="lm", penalization="asgl")\n if solver is not None:\n params_asgl["solver"] = solver\n if tol is not None:\n params_asgl["tol"] = tol\n\n super().__init__(**params_asgl)\n\n self.alpha1 = alpha1\n self.alpha2 = alpha2\n self.l1_ratio1 = l1_ratio1\n self.l1_ratio2 = l1_ratio2\n self.gamma = gamma\n self.fit_intercept = fit_intercept\n self.max_iter = max_iter\n self.precompute = precompute\n self.copy_X = copy_X\n self.positive = positive\n self.positive_tol = positive_tol\n self.random_state = random_state\n self.eps_coef = eps_coef\n self.verbose = verbose\n\n if not self.fit_intercept:\n raise NotImplementedError\n\n def fit(self, X, y, check_input=True):\n if check_input:\n X_copied = self.copy_X and self.fit_intercept\n X, y = self._validate_data(\n X,\n y,\n accept_sparse="csc",\n order="F",\n dtype=[np.float64, np.float32],\n copy=X_copied,\n multi_output=True,\n y_numeric=True,\n )\n\n # 第一段階の ElasticNet 実行\n enet_model_1 = self.elastic_net(self.l1_ratio1, alpha=self.alpha1)\n enet_model_1.fit(X, y)\n enet_coef = enet_model_1.coef_\n\n # 重みの計算\n weights = 1.0 / (np.maximum(np.abs(enet_coef), self.eps_coef) ** self.gamma)\n\n # 第二段階の最適化\n self.coef_, self.intercept_ = self._optimize_second_stage(X, y, weights)\n\n # モデル属性を格納\n self.enet_coef_ = enet_coef\n self.weights_ = weights\n\n return self\n\n def predict(self, X):\n check_is_fitted(self, ["coef_", "intercept_"])\n return super(ElasticNet, self).predict(X)\n\n def elastic_net(self, l1_ratio, **params):\n """\n Create an ElasticNet model with the specified parameters.\n """\n elastic_net = ElasticNet(l1_ratio=l1_ratio)\n\n for k, v in self.get_params().items():\n try:\n elastic_net = elastic_net.set_params(**{k: v})\n except ValueError:\n pass # Ignore parameters not supported by ElasticNet\n\n elastic_net = elastic_net.set_params(**params)\n return elastic_net\n\n def _optimize_second_stage(self, X, y, weights):\n """\n Perform second-stage optimization with adaptive weights.\n\n Returns\n -------\n coef : np.array, shape (n_features,)\n intercept : float\n """\n n_samples, n_features = X.shape\n beta_variables = [cvxpy.Variable(n_features)]\n\n model_prediction = 0.0\n if self.fit_intercept:\n beta_variables = [cvxpy.Variable(1)] + beta_variables\n ones = cvxpy.Constant(np.ones((n_samples, 1)))\n model_prediction += ones @ beta_variables[0]\n\n # モデル予測\n model_prediction += X @ beta_variables[1]\n error = cvxpy.sum_squares(y - model_prediction) / (2 * n_samples)\n l1_coefs = self.alpha2 * self.l1_ratio2\n # 第二段階の正則化項\n l1_penalty = cvxpy.Constant(l1_coefs * weights) @ cvxpy.abs(\n beta_variables[1]\n )\n l2_penalty = (\n cvxpy.Constant(self.alpha1 * (1 - self.l1_ratio1))\n * cvxpy.sum_squares(beta_variables[1])\n )\n\n constraints = [b >= 0 for b in beta_variables] if self.positive else []\n\n # 最適化問題の定義\n problem = cvxpy.Problem(\n cvxpy.Minimize(error + l1_penalty + l2_penalty), constraints=constraints\n )\n problem.solve(solver="OSQP", max_iter=self.max_iter)\n\n if problem.status != "optimal":\n raise ConvergenceWarning(\n f"Solver did not reach optimum (Status: {problem.status})"\n )\n\n beta_sol = np.concatenate([b.value for b in beta_variables], axis=0)\n beta_sol[np.abs(beta_sol) < self.tol] = 0\n\n intercept, coef = beta_sol[0], beta_sol[1:]\n coef = np.maximum(coef, 0) if self.positive else coef\n\n return coef, intercept\n\n\nfrom sklearn.linear_model import ElasticNetCV\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.datasets import make_regression\nimport numpy as np\nfrom sklearn.model_selection import train_test_split\nimport pandas as pd\nfrom sklearn.preprocessing import StandardScaler\n\n# CSVファイルのパスを指定してください\nfile_path = "C:/Users/nt011/Desktop/研究/富山取引のほう富山市のみ/変数選択/変数作成後新新.csv"\n\n# CSVファイルの読み込み\ndf = pd.read_csv(file_path, encoding='cp932') # 文字コードが異なる場合は、'utf-8' を他のエンコーディングに変更してください\n\n# 特徴量とターゲットの分割\nX = df.drop(columns=['取引価格(㎡単価)']) # 取引価格(㎡単価)をyとして分離\ny = df['取引価格(㎡単価)'] # ターゲット変数\n\n# 🔥 標準化の実施\nscaler_X = StandardScaler()\nscaler_y = StandardScaler()\n\nX_scaled = scaler_X.fit_transform(X) # Xの標準化\ny_scaled = scaler_y.fit_transform(y.values.reshape(-1, 1)).ravel() # yの標準化\n\n\n# データ分割\nX_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.35, random_state=42)\n\n# 訓練データの一部を使用\nX_sample, _, y_sample, _ = train_test_split(X_train, y_train, test_size=0.8, random_state=42)\n\n# 第一段階: ElasticNetCVを使用した最適パラメータの導出\nenet_cv = ElasticNetCV(\n l1_ratio=np.linspace(0.0001, 1, 25), # l1_ratioの候補\n alphas=np.logspace(-5, 0, 25), # alphaの候補\n cv=5, # 交差検証の分割数\n random_state=42,\n n_jobs=-1\n)\nenet_cv.fit(X_train, y_train)\n\n# 第一段階の最適パラメータと係数を取得\nalpha1_opt = enet_cv.alpha_\nl1_ratio1_opt = enet_cv.l1_ratio_\nenet_coef = enet_cv.coef_\n\nprint(f"第一段階の最適パラメータ: alpha1={alpha1_opt}, l1_ratio1={l1_ratio1_opt}")\n\n\nsession = requests.session()\nres = session.get(\n url = "https://www.machi-info.jp/machikado/police_pref_toyama/smartphone/map/mapindex.jsp",\n headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Mobile Safari/537.36 Edg/103.0.1264.44"}\n)\nres = session.get(\n url = f"https://www.machi-info.jp/machikado/police_pref_toyama/FoiView.jsp?uid=115&mode=1&layer=00100040005000510060007000800090&minlon={deg2str(west)}&minlat={deg2str(south)}&maxlon={deg2str(east)}&maxlat={deg2str(north)}&scale=10000&start={date2str(since)}&end={date2str(until)}&flag2=&flag=&init=2",\n headers = {"User-Agent": "Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.66 Mobile Safari/537.36 Edg/103.0.1264.44"}\n)) ---- ~ &color(,#000000){'' '''&color(#FFFFFF){やること};''' ''}; #memo(from sklearn.linear_model import ElasticNet\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.datasets import make_regression\nimport numpy as np\nimport pandas as pd\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.model_selection import train_test_split\n\n\n# CSVファイルのパスを指定してください\nfile_path = "C:/Users/nt011/Desktop/研究/富山取引のほう富山市のみ/変数選択/変数作成後新.csv"\n\n# CSVファイルの読み込み\ndf = pd.read_csv(file_path, encoding='cp932') # 文字コードが異なる場合は、'utf-8' を他のエンコーディングに変更してください\n\n# 特徴量とターゲットの分割\nX = df.drop(columns=['取引価格(㎡単価)']) # 取引価格(㎡単価)をyとして分離\ny = df['取引価格(㎡単価)'] # ターゲット変数\n\n# 🔥 標準化の実施\nscaler_X = StandardScaler()\nscaler_y = StandardScaler()\n\nX_scaled = scaler_X.fit_transform(X) # Xの標準化\ny_scaled = scaler_y.fit_transform(y.values.reshape(-1, 1)).ravel() # yの標準化\n\n\n# データ分割\nX_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.2, random_state=42)\n\n# 訓練データの一部を使用\nX_sample, _, y_sample, _ = train_test_split(X_train, y_train, test_size=0.8, random_state=42)\n\n# 2. パラメータグリッドの設定\nparam_grid = {\n 'alpha': np.logspace(-5, 0, 10), # alpha1の探索範囲 (正則化パラメータ)\n 'l1_ratio': np.linspace(0.0001, 1.0, 10) # l1_ratio1の探索範囲 (L1とL2の比率)\n}\n\n# パラメータ名を変更(alpha -> alpha1, l1_ratio -> l1_ratio1)\nparam_grid = {'alpha1': param_grid['alpha'], 'l1_ratio1': param_grid['l1_ratio']}\n\n# 3. ElasticNetモデルの初期化\nelastic_net = ElasticNet(max_iter=10000, random_state=42)\n\n# 4. グリッドサーチCVの設定\ngrid_search = GridSearchCV(\n estimator=elastic_net,\n param_grid={'alpha': param_grid['alpha1'], 'l1_ratio': param_grid['l1_ratio1']}, # 変更した名前に対応\n cv=5, # 5分割交差検証\n scoring='neg_mean_squared_error', # 評価指標: 平均二乗誤差の負値\n verbose=1,\n n_jobs=-1 # 並列実行\n)\n\n# 5. グリッドサーチの実行\ngrid_search.fit(X_sample, y_sample)\n\n# 6. 最適なパラメータとスコアの取得\nbest_params = grid_search.best_params_\nbest_params_renamed = {'alpha1': best_params['alpha'], 'l1_ratio1': best_params['l1_ratio']}\nbest_score = grid_search.best_score_\n\nprint("最適なパラメータ:")\nprint(best_params_renamed)\nprint("最良のスコア (平均二乗誤差の負値):")\nprint(best_score)\n\n\nclass TQDMGridSearchCV(GridSearchCV):\n def __init__(self, estimator, param_grid, cv=5, scoring=None, n_jobs=None, verbose=0, \n refit=True, return_train_score=True, pre_dispatch='2*n_jobs', error_score='raise', **kwargs):\n # iid引数を削除して、super()に渡さない\n super().__init__(estimator=estimator, param_grid=param_grid, cv=cv, scoring=scoring,\n n_jobs=n_jobs, verbose=verbose, refit=refit, return_train_score=return_train_score,\n pre_dispatch=pre_dispatch, error_score=error_score, **kwargs)\n \n # tqdmを使って進捗表示\n self.tqdm = tqdm(total=1, position=0, leave=True)\n \n def fit(self, X, y=None, **fit_params):\n # 進捗バーを更新\n self.tqdm.set_description("Fitting model")\n \n result = super().fit(X, y, **fit_params)\n \n self.tqdm.close() # 進捗バーを閉じる\n return result\n\n# 第二段階のGridSearchCVで交差検証(進捗表示を追加)\ngrid_search = TQDMGridSearchCV(\n estimator=model,\n param_grid=param_grid,\n cv=5, # 交差検証の分割数\n scoring='neg_mean_squared_error', # 評価指標(MSEの負の値を使用)\n #n_jobs=-1, # 並列実行\n verbose=1 # 実行状況を表示しない\n)) ---- ~ #memo(import numba\nfrom numba import jit\nimport numpy as np\nimport pandas as pd\nfrom sklearn.linear_model import ElasticNet\nfrom sklearn.model_selection import train_test_split\nfrom sklearn.preprocessing import StandardScaler\nfrom sklearn.metrics import mean_squared_error\nfrom sklearn.model_selection import cross_val_score\n\n\n# Numbaを使った交差検証の高速化\n\n@jit(nopython=True)\ndef cross_val_score_numba(X, y, model, cv=5):\n """\n Numbaを使用した交差検証の実装\n """\n n_samples = X.shape[0]\n fold_size = n_samples // cv\n scores = np.zeros(cv)\n \n for i in range(cv):\n # フォールドの分割\n val_idx = list(range(i * fold_size, (i + 1) * fold_size))\n train_idx = list(set(range(n_samples)) - set(val_idx))\n \n X_train, X_val = X[train_idx], X[val_idx]\n y_train, y_val = y[train_idx], y[val_idx]\n \n model.fit(X_train, y_train)\n y_pred = model.predict(X_val)\n \n # MSEスコアの計算\n scores[i] = mean_squared_error(y_val, y_pred)\n \n return scores\n\n# CSVファイルのパスを指定してください\nfile_path = "C:/Users/tn011/Desktop/変数作成後新新.csv"\n\n# CSVファイルの読み込み\ndf = pd.read_csv(file_path, encoding='cp932')\n\n# 特徴量とターゲットの分割\nX = df.drop(columns=['取引価格(㎡単価)'])\ny = df['取引価格(㎡単価)']\n\n# 標準化の実施\nscaler_X = StandardScaler()\nscaler_y = StandardScaler()\n\nX_scaled = scaler_X.fit_transform(X)\ny_scaled = scaler_y.fit_transform(y.values.reshape(-1, 1)).ravel()\n\n# 訓練データとテストデータに分割\nX_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.35, random_state=42)\n\n# 第一段階のElasticNetのハイパーパラメータチューニング\nalpha_values = np.logspace(-5, 0, 25)\nl1_ratio_values = np.linspace(0.0001, 1, 25)\n\nbest_score = float('inf')\nbest_alpha = None\nbest_l1_ratio = None\nbest_model = None\n\n# numbaを使用した交差検証を実行\nfor alpha in alpha_values:\n for l1_ratio in l1_ratio_values:\n model = ElasticNet(alpha=alpha, l1_ratio=l1_ratio, max_iter=10000)\n \n scores = cross_val_score(model, X_train, y_train, cv=5, scoring='neg_mean_squared_error')\n \n mean_score = np.mean(scores)\n \n if mean_score < best_score:\n best_score = mean_score\n best_alpha1 = alpha\n best_l1_ratio1 = l1_ratio\n best_model = model\n\nprint(f"最適なalpha: {best_alpha1}, 最適なl1_ratio: {best_l1_ratio1}")\n\n# 最適なモデルのトレーニング\nbest_model.fit(X_train, y_train)\ny_pred = best_model.predict(X_test)\n\n# テストデータでの性能を評価\ntest_score = mean_squared_error(y_test, y_pred)\nprint(f"テストデータのMSE: {test_score}")\n\n\n高速化\nimport numbers\nimport warnings\nfrom numba import njit, prange\nimport numpy as np\nimport cvxpy\nfrom asgl import ASGL\nfrom sklearn.base import MultiOutputMixin\nfrom sklearn.base import RegressorMixin\nfrom sklearn.exceptions import ConvergenceWarning\nfrom sklearn.linear_model import ElasticNet\nfrom sklearn.utils import check_X_y\nfrom sklearn.utils.validation import check_is_fitted\nfrom numba import njit, prange\n\n\nclass AdaptiveElasticNet(ASGL, ElasticNet, MultiOutputMixin, RegressorMixin):\n """\n Adaptive ElasticNet implementation with customizable parameters.\n """\n def __init__(\n self,\n alpha1=0.008, # First-stage ElasticNet alpha\n alpha2=0.0009443498043343188, # Second-stage ElasticNet alpha\n *,\n l1_ratio1=0.875, # First-stage ElasticNet L1 ratio\n l1_ratio2=0.778, # Second-stage ElasticNet L1 ratio\n gamma=0.5, # Weight adjustment exponent\n fit_intercept=True,\n precompute=False,\n max_iter=5000,\n copy_X=True,\n solver=None,\n tol=None,\n positive=False,\n positive_tol=1e-3,\n random_state=None,\n eps_coef=1e-6,\n verbose=True,\n ):\n params_asgl = dict(model="lm", penalization="asgl")\n if solver is not None:\n params_asgl["solver"] = solver\n if tol is not None:\n params_asgl["tol"] = tol\n\n super().__init__(**params_asgl)\n\n self.alpha1 = alpha1\n self.alpha2 = alpha2\n self.l1_ratio1 = l1_ratio1\n self.l1_ratio2 = l1_ratio2\n self.gamma = gamma\n self.fit_intercept = fit_intercept\n self.max_iter = max_iter\n self.precompute = precompute\n self.copy_X = copy_X\n self.positive = positive\n self.positive_tol = positive_tol\n self.random_state = random_state\n self.eps_coef = eps_coef\n self.verbose = verbose\n\n if not self.fit_intercept:\n raise NotImplementedError\n \n\n @staticmethod\n @njit(parallel=True)\n def adaptive_weight_calculation(coef, eps_coef, gamma):\n """\n Accelerated weight calculation using numba.\n """\n weights = np.empty_like(coef)\n for i in prange(len(coef)):\n weights[i] = 1.0 / (max(abs(coef[i]), eps_coef) ** gamma)\n return weights\n \n def fit(self, X, y, check_input=True):\n if check_input:\n X_copied = self.copy_X and self.fit_intercept\n X, y = self._validate_data(\n X,\n y,\n accept_sparse="csc",\n order="F",\n dtype=[np.float64, np.float32],\n copy=X_copied,\n multi_output=True,\n y_numeric=True,\n )\n\n # First-stage ElasticNet\n enet_model_1 = self.elastic_net(self.l1_ratio1, alpha=self.alpha1)\n enet_model_1.fit(X, y)\n enet_coef = enet_model_1.coef_\n\n # Compute adaptive weights\n weights = self.adaptive_weight_calculation(enet_coef, self.eps_coef, self.gamma)\n\n\n\n # Second-stage optimization\n self.coef_, self.intercept_ = self._optimize_second_stage(X, y, weights)\n\n # Store model attributes\n self.enet_coef_ = enet_coef\n self.weights_ = weights\n\n return self\n\n def predict(self, X):\n check_is_fitted(self, ["coef_", "intercept_"])\n return super(ElasticNet, self).predict(X)\n\n def elastic_net(self, l1_ratio1, **params):\n """\n Create an ElasticNet model with the specified parameters.\n """\n elastic_net = ElasticNet(l1_ratio=l1_ratio1)\n\n for k, v in self.get_params().items():\n try:\n elastic_net = elastic_net.set_params(**{k: v})\n except ValueError:\n pass\n\n elastic_net = elastic_net.set_params(**params)\n return elastic_net\n \n @staticmethod\n @njit(parallel=True, fastmath=True)\n def fista(X, y, weights, alpha1, l1_ratio1, alpha2, l1_ratio2, max_iter=5000, tol=1e-6):\n """\n FISTAによる適応ElasticNetの第2段階最適化処理。\n \n Parameters\n ----------\n X : ndarray\n 特徴量行列 (n_samples, n_features)\n y : ndarray\n 目的変数 (n_samples,)\n weights : ndarray\n 適応的L1正則化の重み\n alpha1 : float\n 第1段階のElasticNetの正則化係数\n l1_ratio1 : float\n 第1段階のL1比率\n alpha2 : float\n 第2段階のElasticNetの正則化係数\n l1_ratio2 : float\n 第2段階のL1比率\n max_iter : int, optional\n 最大反復回数 (default=5000)\n tol : float, optional\n 収束許容誤差 (default=1e-6)\n\n Returns\n -------\n beta : ndarray\n 推定された係数 (n_features,)\n """\n\n n_samples, n_features = X.shape\n beta = np.zeros(n_features) # 係数の初期化\n beta_old = beta.copy()\n t = 1\n\n # Lipschitz定数の計算(手動でL2ノルム計算)\n L = np.sqrt(np.sum(X**2)) ** 2 / n_samples \n\n # L2 正則化項(第一段階のパラメータを利用)\n L2_penalty = alpha1 * (1 - l1_ratio1)\n\n for _ in prange(max_iter):\n # 勾配計算\n grad = -X.T @ (y - X @ beta) / n_samples \n\n # ソフトしきい値処理(L1 正則化)\n z = beta - grad / L\n shrink = alpha2 * l1_ratio2 * weights / L\n beta_new = np.sign(z) * np.maximum(np.abs(z) - shrink, 0)\n\n # Nesterov 加速\n t_new = (1 + np.sqrt(1 + 4 * t ** 2)) / 2\n beta = beta_new + ((t - 1) / t_new) * (beta_new - beta_old)\n\n # 収束判定\n if np.linalg.norm(beta - beta_old, ord=2) < tol:\n break\n\n beta_old = beta.copy()\n t = t_new\n\n return beta\n\n \n\n def _optimize_second_stage(self, X, y, weights):\n """\n Perform second-stage optimization with adaptive weights using Numba-accelerated FISTA.\n """\n coef = self.fista(\n X, y, weights, self.alpha1, self.l1_ratio1, self.alpha2, self.l1_ratio2, max_iter=self.max_iter, tol=self.tol\n)\n\n\n\n\n\n intercept = np.mean(y - X @ coef) if self.fit_intercept else 0\n return coef, intercept\n\n\n\n# Updated usage with numba-optimized weight calculation\nfrom sklearn.model_selection import GridSearchCV\nfrom sklearn.datasets import make_regression\nfrom sklearn.model_selection import train_test_split\nimport pandas as pd\nfrom sklearn.preprocessing import StandardScaler\n\n# CSV file path\nfile_path = "C:/Users/nt011/Desktop/研究/富山取引のほう富山市のみ/変数選択/変数作成後新新.csv"\n\n# Load CSV data\ndf = pd.read_csv(file_path, encoding="cp932")\n\n# Split features and target\nX = df.drop(columns=["取引価格(㎡単価)"])\ny = df["取引価格(㎡単価)"]\n\n# Standardize data\nscaler_X = StandardScaler()\nscaler_y = StandardScaler()\n\nX_scaled = scaler_X.fit_transform(X)\ny_scaled = scaler_y.fit_transform(y.values.reshape(-1, 1)).ravel()\n\n# Split data\nX_train, X_test, y_train, y_test = train_test_split(X_scaled, y_scaled, test_size=0.35, random_state=42)\n\n# 訓練データの一部を使用\nX_sample, _, y_sample, _ = train_test_split(X_train, y_train, test_size=0.8, random_state=42)\n\n# First-stage ElasticNet\nmodel = AdaptiveElasticNet(alpha1=0.00825404185268019, l1_ratio1=0.8750125, gamma=0.5)\n\n# Second-stage parameter grid\nparam_grid = {\n "alpha2": np.logspace(-4, 0, 5),\n "l1_ratio2": np.linspace(0.0001, 1.0, 5),\n}\n\n# GridSearchCV with accelerated weight calculation\ngrid_search = GridSearchCV(\n estimator=model,\n param_grid=param_grid,\n cv=3,\n scoring="neg_mean_squared_error",\n n_jobs=-1,\n verbose=1,\n)\n\n# Fit GridSearchCV\ngrid_search.fit(X_sample, y_sample)\n\n# Output best parameters and score\nprint(f"Best parameters: {grid_search.best_params_}")\nprint(f"Best negative MSE: {grid_search.best_score_}")\n\n\n\n\n\ndef mesh_code_to_latlon_borders(mesh_code: str, apply_correction: bool = True):\n """\n 日本の地域メッシュコードを用いて、メッシュの東西南北の座標を求める。\n\n Parameters\n ----------\n mesh_code : str\n 変換する地域メッシュコード。\n apply_correction : bool, optional\n メッシュの中心点を取得するかどうか(デフォルトは `True`)。\n\n Returns\n -------\n dict\n メッシュコードに対応する南北東西、中心点(center)の座標情報を辞書形式で返す。\n """\n # メッシュコードの長さに基づくレベルの設定\n mesh_lengths = {4: 0, 6: 1, 8: 2, 9: 3, 10: 4}\n \n # メッシュコードの長さを確認\n mesh_length = len(mesh_code.replace("-", "")) # ハイフンを削除して長さを取得\n \n if mesh_length not in mesh_lengths:\n raise ValueError(f"無効なメッシュコードです。長さが {mesh_length} では対応していません。")\n \n # メッシュレベルを取得\n mesh_level = mesh_lengths[mesh_length]\n \n # メッシュの中心点の座標を取得\n center_lat, center_lon = mesh_code_to_latlon(mesh_code, apply_correction)\n \n # メッシュのレベルに応じた増分(緯度・経度の単位距離)\n increments = [\n (40 / 60, 1), # 第1次メッシュ\n (5 / 60, 7.5 / 60), # 第2次メッシュ\n (30 / 3600, 45 / 3600), # 第3次メッシュ\n (15 / 3600, 22.5 / 3600), # 第4次メッシュ(2分の1地域メッシュ)\n (7.5 / 3600, 11.25 / 3600) # 第5次メッシュ(4分の1地域メッシュ)\n ]\n\n # メッシュの中心点からの増分(経度、緯度)\n lat_inc, lon_inc = increments[mesh_level] # メッシュレベルに基づいて増分を取得\n\n # メッシュの南北東西の座標を計算\n south = center_lat - lat_inc / 2\n north = center_lat + lat_inc / 2\n west = center_lon - lon_inc / 2\n east = center_lon + lon_inc / 2\n\n # 結果として辞書形式で南北東西、中心を返す\n return {\n 'north': north,\n 'south': south,\n 'east': east,\n 'west': west,\n 'center': [center_lon, center_lat]\n }\n\n\n# メッシュコードごとに座標情報を計算し、格納\n_meshes = {}\n\n# meshes(メッシュコードのリスト)が与えられている前提で、それぞれのメッシュコードに対する座標情報を計算\nfor meshcode in meshes:\n # 各メッシュコードの境界座標を取得\n _meshes[meshcode] = mesh_code_to_latlon_borders(meshcode)\n\n# 結果として_meshesには9桁のメッシュコードに対応する座標情報が格納される\nmeshes = _meshes # 最終的にmeshesを更新\n\n# 結果を確認\nprint(meshes)\n) =IF(LEFT(L2,2)="令和", 2018 + MID(L2,3,LEN(L2)-3), IF(LEFT(L2,2)="平成", 1988 + MID(L2,3,LEN(L2)-3), IF(LEFT(L2,2)="昭和", 1925 + MID(L2,3,LEN(L2)-3), "エラー"))) =IF(LEFT(M2,2)="令和", 2018 + MID(M2,3,LEN(M2)-3), IF(LEFT(M2,2)="平成", 1988 + MID(M2,3,LEN(M2)-3), IF(LEFT(M2,2)="昭和", 1925 + MID(M2,3,LEN(M2)-3), "エラー"))) =LEFT(W2,4)