#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&#x22;C:\Users\tn011\Downloads\富山取引のほう 富山市のみ 2\富山取引のほう 富山市のみ\df_housing_toyamacity.csv&#x22;\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('令和'&#x2c; ''))\n        return 2018 + year  # 令和は2019年から\n    elif '平成' in gengo_year:\n        year = int(gengo_year.replace('平成'&#x2c; ''))\n        return 1988 + year  # 平成は1989年から\n    elif '昭和' in gengo_year:\n        year = int(gengo_year.replace('昭和'&#x2c; ''))\n        return 1925 + year  # 昭和は1926年から\n    elif '大正' in gengo_year:\n        year = int(gengo_year.replace('大正'&#x2c; ''))\n        return 1911 + year  # 大正は1912年から\n    elif '明治' in gengo_year:\n        year = int(gengo_year.replace('明治'&#x2c; ''))\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&#x22;C:\Users\tn011\Downloads\富山取引のほう 富山市のみ 2\富山取引のほう 富山市のみ\df_housing_toyamacity_with_seireki.csv&#x22;\ndf.to_csv(output_path&#x2c; 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&#x2c; ElasticNet&#x2c; MultiOutputMixin&#x2c; RegressorMixin):\n    &#x22;&#x22;&#x22;\n    Objective function and parameters as described with modifications\n    to allow alpha1&#x2c; alpha2&#x2c; l1_ratio1&#x2c; and l1_ratio2 customization.\n    &#x22;&#x22;&#x22;\n\n    def __init__(\n        self&#x2c;\n        alpha1=0.021544346900318846&#x2c;   # First-stage ElasticNet alpha\n        alpha2=0.0009443498043343188&#x2c;  # Second-stage ElasticNet alpha\n        *&#x2c;\n        l1_ratio1=0.8889&#x2c;  # First-stage ElasticNet L1 ratio\n        l1_ratio2=0.778&#x2c;  # Second-stage ElasticNet L1 ratio\n        gamma=0.5&#x2c;  # Weight adjustment exponent\n        fit_intercept=True&#x2c;\n        precompute=False&#x2c;\n        max_iter=10000&#x2c;\n        copy_X=True&#x2c;\n        solver=None&#x2c;\n        tol=None&#x2c;\n        positive=False&#x2c;\n        positive_tol=1e-3&#x2c;\n        random_state=None&#x2c;\n        eps_coef=1e-6&#x2c;\n        verbose=True\n    ):\n        params_asgl = dict(model=&#x22;lm&#x22;&#x2c; penalization=&#x22;asgl&#x22;)\n        if solver is not None:\n            params_asgl[&#x22;solver&#x22;] = solver\n        if tol is not None:\n            params_asgl[&#x22;tol&#x22;] = 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&#x2c; X&#x2c; y&#x2c; check_input=True):\n        if check_input:\n            X_copied = self.copy_X and self.fit_intercept\n            X&#x2c; y = self._validate_data(\n                X&#x2c;\n                y&#x2c;\n                accept_sparse=&#x22;csc&#x22;&#x2c;\n                order=&#x22;F&#x22;&#x2c;\n                dtype=[np.float64&#x2c; np.float32]&#x2c;\n                copy=X_copied&#x2c;\n                multi_output=True&#x2c;\n                y_numeric=True&#x2c;\n            )\n\n        # 第一段階の ElasticNet 実行\n        enet_model_1 = self.elastic_net(self.l1_ratio1&#x2c; alpha=self.alpha1)\n        enet_model_1.fit(X&#x2c; y)\n        enet_coef = enet_model_1.coef_\n\n        # 重みの計算\n        weights = 1.0 / (np.maximum(np.abs(enet_coef)&#x2c; self.eps_coef) ** self.gamma)\n\n        # 第二段階の最適化\n        self.coef_&#x2c; self.intercept_ = self._optimize_second_stage(X&#x2c; y&#x2c; weights)\n\n        # モデル属性を格納\n        self.enet_coef_ = enet_coef\n        self.weights_ = weights\n\n        return self\n\n    def predict(self&#x2c; X):\n        check_is_fitted(self&#x2c; [&#x22;coef_&#x22;&#x2c; &#x22;intercept_&#x22;])\n        return super(ElasticNet&#x2c; self).predict(X)\n\n    def elastic_net(self&#x2c; l1_ratio&#x2c; **params):\n        &#x22;&#x22;&#x22;\n        Create an ElasticNet model with the specified parameters.\n        &#x22;&#x22;&#x22;\n        elastic_net = ElasticNet(l1_ratio=l1_ratio)\n\n        for k&#x2c; 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&#x2c; X&#x2c; y&#x2c; weights):\n        &#x22;&#x22;&#x22;\n        Perform second-stage optimization with adaptive weights.\n\n        Returns\n        -------\n        coef : np.array&#x2c; shape (n_features&#x2c;)\n        intercept : float\n        &#x22;&#x22;&#x22;\n        n_samples&#x2c; 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&#x2c; 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)&#x2c; constraints=constraints\n        )\n        problem.solve(solver=&#x22;OSQP&#x22;&#x2c; max_iter=self.max_iter)\n\n        if problem.status != &#x22;optimal&#x22;:\n            raise ConvergenceWarning(\n                f&#x22;Solver did not reach optimum (Status: {problem.status})&#x22;\n            )\n\n        beta_sol = np.concatenate([b.value for b in beta_variables]&#x2c; axis=0)\n        beta_sol[np.abs(beta_sol) < self.tol] = 0\n\n        intercept&#x2c; coef = beta_sol[0]&#x2c; beta_sol[1:]\n        coef = np.maximum(coef&#x2c; 0) if self.positive else coef\n\n        return coef&#x2c; 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 = &#x22;C:/Users/nt011/Desktop/研究/富山取引のほう富山市のみ/変数選択/変数作成後新新.csv&#x22;\n\n# CSVファイルの読み込み\ndf = pd.read_csv(file_path&#x2c; 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&#x2c; 1)).ravel()  # yの標準化\n\n\n# データ分割\nX_train&#x2c; X_test&#x2c; y_train&#x2c; y_test = train_test_split(X_scaled&#x2c; y_scaled&#x2c; test_size=0.35&#x2c; random_state=42)\n\n# 訓練データの一部を使用\nX_sample&#x2c; _&#x2c; y_sample&#x2c; _ = train_test_split(X_train&#x2c; y_train&#x2c; test_size=0.8&#x2c; random_state=42)\n\n# 第一段階: ElasticNetCVを使用した最適パラメータの導出\nenet_cv = ElasticNetCV(\n    l1_ratio=np.linspace(0.0001&#x2c; 1&#x2c; 25)&#x2c;  # l1_ratioの候補\n    alphas=np.logspace(-5&#x2c; 0&#x2c; 25)&#x2c;  # alphaの候補\n    cv=5&#x2c;  # 交差検証の分割数\n    random_state=42&#x2c;\n    n_jobs=-1\n)\nenet_cv.fit(X_train&#x2c; y_train)\n\n# 第一段階の最適パラメータと係数を取得\nalpha1_opt = enet_cv.alpha_\nl1_ratio1_opt = enet_cv.l1_ratio_\nenet_coef = enet_cv.coef_\n\nprint(f&#x22;第一段階の最適パラメータ: alpha1={alpha1_opt}&#x2c; l1_ratio1={l1_ratio1_opt}&#x22;)\n\n\nsession = requests.session()\nres = session.get(\n    url = &#x22;https://www.machi-info.jp/machikado/police_pref_toyama/smartphone/map/mapindex.jsp&#x22;&#x2c;\n    headers = {&#x22;User-Agent&#x22;: &#x22;Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML&#x2c; like Gecko) Chrome/103.0.5060.66 Mobile Safari/537.36 Edg/103.0.1264.44&#x22;}\n)\nres = session.get(\n    url = f&#x22;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&#x22;&#x2c;\n    headers = {&#x22;User-Agent&#x22;: &#x22;Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML&#x2c; like Gecko) Chrome/103.0.5060.66 Mobile Safari/537.36 Edg/103.0.1264.44&#x22;}\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 = &#x22;C:/Users/nt011/Desktop/研究/富山取引のほう富山市のみ/変数選択/変数作成後新.csv&#x22;\n\n# CSVファイルの読み込み\ndf = pd.read_csv(file_path&#x2c; 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&#x2c; 1)).ravel()  # yの標準化\n\n\n# データ分割\nX_train&#x2c; X_test&#x2c; y_train&#x2c; y_test = train_test_split(X_scaled&#x2c; y_scaled&#x2c; test_size=0.2&#x2c; random_state=42)\n\n# 訓練データの一部を使用\nX_sample&#x2c; _&#x2c; y_sample&#x2c; _ = train_test_split(X_train&#x2c; y_train&#x2c; test_size=0.8&#x2c; random_state=42)\n\n# 2. パラメータグリッドの設定\nparam_grid = {\n    'alpha': np.logspace(-5&#x2c; 0&#x2c; 10)&#x2c;  # alpha1の探索範囲 (正則化パラメータ)\n    'l1_ratio': np.linspace(0.0001&#x2c; 1.0&#x2c; 10)  # l1_ratio1の探索範囲 (L1とL2の比率)\n}\n\n# パラメータ名を変更(alpha -> alpha1&#x2c; l1_ratio -> l1_ratio1)\nparam_grid = {'alpha1': param_grid['alpha']&#x2c; 'l1_ratio1': param_grid['l1_ratio']}\n\n# 3. ElasticNetモデルの初期化\nelastic_net = ElasticNet(max_iter=10000&#x2c; random_state=42)\n\n# 4. グリッドサーチCVの設定\ngrid_search = GridSearchCV(\n    estimator=elastic_net&#x2c;\n    param_grid={'alpha': param_grid['alpha1']&#x2c; 'l1_ratio': param_grid['l1_ratio1']}&#x2c;  # 変更した名前に対応\n    cv=5&#x2c;  # 5分割交差検証\n    scoring='neg_mean_squared_error'&#x2c;  # 評価指標: 平均二乗誤差の負値\n    verbose=1&#x2c;\n    n_jobs=-1  # 並列実行\n)\n\n# 5. グリッドサーチの実行\ngrid_search.fit(X_sample&#x2c; y_sample)\n\n# 6. 最適なパラメータとスコアの取得\nbest_params = grid_search.best_params_\nbest_params_renamed = {'alpha1': best_params['alpha']&#x2c; 'l1_ratio1': best_params['l1_ratio']}\nbest_score = grid_search.best_score_\n\nprint(&#x22;最適なパラメータ:&#x22;)\nprint(best_params_renamed)\nprint(&#x22;最良のスコア (平均二乗誤差の負値):&#x22;)\nprint(best_score)\n\n\nclass TQDMGridSearchCV(GridSearchCV):\n    def __init__(self&#x2c; estimator&#x2c; param_grid&#x2c; cv=5&#x2c; scoring=None&#x2c; n_jobs=None&#x2c; verbose=0&#x2c; \n                 refit=True&#x2c; return_train_score=True&#x2c; pre_dispatch='2*n_jobs'&#x2c; error_score='raise'&#x2c; **kwargs):\n        # iid引数を削除して、super()に渡さない\n        super().__init__(estimator=estimator&#x2c; param_grid=param_grid&#x2c; cv=cv&#x2c; scoring=scoring&#x2c;\n                         n_jobs=n_jobs&#x2c; verbose=verbose&#x2c; refit=refit&#x2c; return_train_score=return_train_score&#x2c;\n                         pre_dispatch=pre_dispatch&#x2c; error_score=error_score&#x2c; **kwargs)\n        \n        # tqdmを使って進捗表示\n        self.tqdm = tqdm(total=1&#x2c; position=0&#x2c; leave=True)\n    \n    def fit(self&#x2c; X&#x2c; y=None&#x2c; **fit_params):\n        # 進捗バーを更新\n        self.tqdm.set_description(&#x22;Fitting model&#x22;)\n        \n        result = super().fit(X&#x2c; y&#x2c; **fit_params)\n        \n        self.tqdm.close()  # 進捗バーを閉じる\n        return result\n\n# 第二段階のGridSearchCVで交差検証(進捗表示を追加)\ngrid_search = TQDMGridSearchCV(\n    estimator=model&#x2c;\n    param_grid=param_grid&#x2c;\n    cv=5&#x2c;  # 交差検証の分割数\n    scoring='neg_mean_squared_error'&#x2c;  # 評価指標(MSEの負の値を使用)\n    #n_jobs=-1&#x2c;  # 並列実行\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&#x2c; y&#x2c; model&#x2c; cv=5):\n    &#x22;&#x22;&#x22;\n    Numbaを使用した交差検証の実装\n    &#x22;&#x22;&#x22;\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&#x2c; (i + 1) * fold_size))\n        train_idx = list(set(range(n_samples)) - set(val_idx))\n        \n        X_train&#x2c; X_val = X[train_idx]&#x2c; X[val_idx]\n        y_train&#x2c; y_val = y[train_idx]&#x2c; y[val_idx]\n        \n        model.fit(X_train&#x2c; y_train)\n        y_pred = model.predict(X_val)\n        \n        # MSEスコアの計算\n        scores[i] = mean_squared_error(y_val&#x2c; y_pred)\n    \n    return scores\n\n# CSVファイルのパスを指定してください\nfile_path = &#x22;C:/Users/tn011/Desktop/変数作成後新新.csv&#x22;\n\n# CSVファイルの読み込み\ndf = pd.read_csv(file_path&#x2c; 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&#x2c; 1)).ravel()\n\n# 訓練データとテストデータに分割\nX_train&#x2c; X_test&#x2c; y_train&#x2c; y_test = train_test_split(X_scaled&#x2c; y_scaled&#x2c; test_size=0.35&#x2c; random_state=42)\n\n# 第一段階のElasticNetのハイパーパラメータチューニング\nalpha_values = np.logspace(-5&#x2c; 0&#x2c; 25)\nl1_ratio_values = np.linspace(0.0001&#x2c; 1&#x2c; 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&#x2c; l1_ratio=l1_ratio&#x2c; max_iter=10000)\n        \n        scores = cross_val_score(model&#x2c; X_train&#x2c; y_train&#x2c; cv=5&#x2c; 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&#x22;最適なalpha: {best_alpha1}&#x2c; 最適なl1_ratio: {best_l1_ratio1}&#x22;)\n\n# 最適なモデルのトレーニング\nbest_model.fit(X_train&#x2c; y_train)\ny_pred = best_model.predict(X_test)\n\n# テストデータでの性能を評価\ntest_score = mean_squared_error(y_test&#x2c; y_pred)\nprint(f&#x22;テストデータのMSE: {test_score}&#x22;)\n\n\n高速化\nimport numbers\nimport warnings\nfrom numba import njit&#x2c; 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&#x2c; prange\n\n\nclass AdaptiveElasticNet(ASGL&#x2c; ElasticNet&#x2c; MultiOutputMixin&#x2c; RegressorMixin):\n    &#x22;&#x22;&#x22;\n    Adaptive ElasticNet implementation with customizable parameters.\n    &#x22;&#x22;&#x22;\n    def __init__(\n        self&#x2c;\n        alpha1=0.008&#x2c;  # First-stage ElasticNet alpha\n        alpha2=0.0009443498043343188&#x2c;  # Second-stage ElasticNet alpha\n        *&#x2c;\n        l1_ratio1=0.875&#x2c;  # First-stage ElasticNet L1 ratio\n        l1_ratio2=0.778&#x2c;  # Second-stage ElasticNet L1 ratio\n        gamma=0.5&#x2c;  # Weight adjustment exponent\n        fit_intercept=True&#x2c;\n        precompute=False&#x2c;\n        max_iter=5000&#x2c;\n        copy_X=True&#x2c;\n        solver=None&#x2c;\n        tol=None&#x2c;\n        positive=False&#x2c;\n        positive_tol=1e-3&#x2c;\n        random_state=None&#x2c;\n        eps_coef=1e-6&#x2c;\n        verbose=True&#x2c;\n    ):\n        params_asgl = dict(model=&#x22;lm&#x22;&#x2c; penalization=&#x22;asgl&#x22;)\n        if solver is not None:\n            params_asgl[&#x22;solver&#x22;] = solver\n        if tol is not None:\n            params_asgl[&#x22;tol&#x22;] = 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&#x2c; eps_coef&#x2c; gamma):\n        &#x22;&#x22;&#x22;\n        Accelerated weight calculation using numba.\n        &#x22;&#x22;&#x22;\n        weights = np.empty_like(coef)\n        for i in prange(len(coef)):\n            weights[i] = 1.0 / (max(abs(coef[i])&#x2c; eps_coef) ** gamma)\n        return weights\n    \n    def fit(self&#x2c; X&#x2c; y&#x2c; check_input=True):\n        if check_input:\n            X_copied = self.copy_X and self.fit_intercept\n            X&#x2c; y = self._validate_data(\n                X&#x2c;\n                y&#x2c;\n                accept_sparse=&#x22;csc&#x22;&#x2c;\n                order=&#x22;F&#x22;&#x2c;\n                dtype=[np.float64&#x2c; np.float32]&#x2c;\n                copy=X_copied&#x2c;\n                multi_output=True&#x2c;\n                y_numeric=True&#x2c;\n            )\n\n        # First-stage ElasticNet\n        enet_model_1 = self.elastic_net(self.l1_ratio1&#x2c; alpha=self.alpha1)\n        enet_model_1.fit(X&#x2c; y)\n        enet_coef = enet_model_1.coef_\n\n        # Compute adaptive weights\n        weights = self.adaptive_weight_calculation(enet_coef&#x2c; self.eps_coef&#x2c; self.gamma)\n\n\n\n        # Second-stage optimization\n        self.coef_&#x2c; self.intercept_ = self._optimize_second_stage(X&#x2c; y&#x2c; 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&#x2c; X):\n        check_is_fitted(self&#x2c; [&#x22;coef_&#x22;&#x2c; &#x22;intercept_&#x22;])\n        return super(ElasticNet&#x2c; self).predict(X)\n\n    def elastic_net(self&#x2c; l1_ratio1&#x2c; **params):\n        &#x22;&#x22;&#x22;\n        Create an ElasticNet model with the specified parameters.\n        &#x22;&#x22;&#x22;\n        elastic_net = ElasticNet(l1_ratio=l1_ratio1)\n\n        for k&#x2c; 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&#x2c; fastmath=True)\n    def fista(X&#x2c; y&#x2c; weights&#x2c; alpha1&#x2c; l1_ratio1&#x2c; alpha2&#x2c; l1_ratio2&#x2c; max_iter=5000&#x2c; tol=1e-6):\n        &#x22;&#x22;&#x22;\n    FISTAによる適応ElasticNetの第2段階最適化処理。\n    \n    Parameters\n    ----------\n    X : ndarray\n        特徴量行列 (n_samples&#x2c; n_features)\n    y : ndarray\n        目的変数 (n_samples&#x2c;)\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&#x2c; optional\n        最大反復回数 (default=5000)\n    tol : float&#x2c; optional\n        収束許容誤差 (default=1e-6)\n\n    Returns\n    -------\n    beta : ndarray\n        推定された係数 (n_features&#x2c;)\n        &#x22;&#x22;&#x22;\n\n        n_samples&#x2c; 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&#x2c; 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&#x2c; 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&#x2c; X&#x2c; y&#x2c; weights):\n        &#x22;&#x22;&#x22;\n    Perform second-stage optimization with adaptive weights using Numba-accelerated FISTA.\n        &#x22;&#x22;&#x22;\n        coef = self.fista(\n    X&#x2c; y&#x2c; weights&#x2c; self.alpha1&#x2c; self.l1_ratio1&#x2c; self.alpha2&#x2c; self.l1_ratio2&#x2c; max_iter=self.max_iter&#x2c; 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&#x2c; 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 = &#x22;C:/Users/nt011/Desktop/研究/富山取引のほう富山市のみ/変数選択/変数作成後新新.csv&#x22;\n\n# Load CSV data\ndf = pd.read_csv(file_path&#x2c; encoding=&#x22;cp932&#x22;)\n\n# Split features and target\nX = df.drop(columns=[&#x22;取引価格(㎡単価)&#x22;])\ny = df[&#x22;取引価格(㎡単価)&#x22;]\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&#x2c; 1)).ravel()\n\n# Split data\nX_train&#x2c; X_test&#x2c; y_train&#x2c; y_test = train_test_split(X_scaled&#x2c; y_scaled&#x2c; test_size=0.35&#x2c; random_state=42)\n\n# 訓練データの一部を使用\nX_sample&#x2c; _&#x2c; y_sample&#x2c; _ = train_test_split(X_train&#x2c; y_train&#x2c; test_size=0.8&#x2c; random_state=42)\n\n# First-stage ElasticNet\nmodel = AdaptiveElasticNet(alpha1=0.00825404185268019&#x2c; l1_ratio1=0.8750125&#x2c; gamma=0.5)\n\n# Second-stage parameter grid\nparam_grid = {\n    &#x22;alpha2&#x22;: np.logspace(-4&#x2c; 0&#x2c; 5)&#x2c;\n    &#x22;l1_ratio2&#x22;: np.linspace(0.0001&#x2c; 1.0&#x2c; 5)&#x2c;\n}\n\n# GridSearchCV with accelerated weight calculation\ngrid_search = GridSearchCV(\n    estimator=model&#x2c;\n    param_grid=param_grid&#x2c;\n    cv=3&#x2c;\n    scoring=&#x22;neg_mean_squared_error&#x22;&#x2c;\n    n_jobs=-1&#x2c;\n    verbose=1&#x2c;\n)\n\n# Fit GridSearchCV\ngrid_search.fit(X_sample&#x2c; y_sample)\n\n# Output best parameters and score\nprint(f&#x22;Best parameters: {grid_search.best_params_}&#x22;)\nprint(f&#x22;Best negative MSE: {grid_search.best_score_}&#x22;)\n\n\n\n\n\ndef mesh_code_to_latlon_borders(mesh_code: str&#x2c; apply_correction: bool = True):\n    &#x22;&#x22;&#x22;\n    日本の地域メッシュコードを用いて、メッシュの東西南北の座標を求める。\n\n    Parameters\n    ----------\n    mesh_code : str\n        変換する地域メッシュコード。\n    apply_correction : bool&#x2c; optional\n        メッシュの中心点を取得するかどうか(デフォルトは `True`)。\n\n    Returns\n    -------\n    dict\n        メッシュコードに対応する南北東西、中心点(center)の座標情報を辞書形式で返す。\n    &#x22;&#x22;&#x22;\n    # メッシュコードの長さに基づくレベルの設定\n    mesh_lengths = {4: 0&#x2c; 6: 1&#x2c; 8: 2&#x2c; 9: 3&#x2c; 10: 4}\n    \n    # メッシュコードの長さを確認\n    mesh_length = len(mesh_code.replace(&#x22;-&#x22;&#x2c; &#x22;&#x22;))  # ハイフンを削除して長さを取得\n    \n    if mesh_length not in mesh_lengths:\n        raise ValueError(f&#x22;無効なメッシュコードです。長さが {mesh_length} では対応していません。&#x22;)\n    \n    # メッシュレベルを取得\n    mesh_level = mesh_lengths[mesh_length]\n    \n    # メッシュの中心点の座標を取得\n    center_lat&#x2c; center_lon = mesh_code_to_latlon(mesh_code&#x2c; apply_correction)\n    \n    # メッシュのレベルに応じた増分(緯度・経度の単位距離)\n    increments = [\n        (40 / 60&#x2c; 1)&#x2c;              # 第1次メッシュ\n        (5 / 60&#x2c; 7.5 / 60)&#x2c;        # 第2次メッシュ\n        (30 / 3600&#x2c; 45 / 3600)&#x2c;    # 第3次メッシュ\n        (15 / 3600&#x2c; 22.5 / 3600)&#x2c;  # 第4次メッシュ(2分の1地域メッシュ)\n        (7.5 / 3600&#x2c; 11.25 / 3600) # 第5次メッシュ(4分の1地域メッシュ)\n    ]\n\n    # メッシュの中心点からの増分(経度、緯度)\n    lat_inc&#x2c; 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&#x2c;\n        'south': south&#x2c;\n        'east': east&#x2c;\n        'west': west&#x2c;\n        'center': [center_lon&#x2c; 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)

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS