私の連絡先情報
郵便メール:
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
背景の揺れ:(お金を節約したい方は読まないでください)
最近、AI アノテーターとしてのインターンシップを見つけましたが、基本的には、競争力を高めるために、パラメーターの調整と展開に関するスキルを学びたかっただけです。将来的には履歴書の梱包が容易になるでしょう。
もちろん、チュートリアルの第一候補は Bilibili University です。多くの好評を得ている無料のパラメーター調整ツールを見つけました。オプチュナ。
ちなみに私が行ったインターンシップは、コンテンツのセキュリティに関する指示のためのテキスト注釈(人間の格言: トレーニング セットの内容が確実にポリティカル・コレクトネス)しかし、マスクと顔認識に Yolo5 を使用する方法を学ぶために他のビデオを見たときに、無料の画像の注釈このツールは非常に使いやすく、インストールも使用も簡単で、シンプルさと効率性に重点を置いています。
ツール名:ラベル画像
以前に講師が共有した公開アカウントの記事では、非常に包括的な紹介が行われていました。
https://mp.weixin.qq.com/s/AE_rJwd9cKQkUGFGD6EfAg
パブリックアカウントポータル
————————————————————————————————————————————
テキスト: Optuna と学習プロセスについて
**ビデオチュートリアルのリンク: **https://www.bilibili.com/list/watchlater?oid=832000670&bvid=BV1c34y1G7E8&spm_id_from=333.1007.top_right_bar_window_view_later.content.click
ステーション B マスターのビデオ
インストール方法:
Anaconda も conda 経由でインストールする必要があります。トラブルを避けるために、ビデオで示されているように pip 経由でインストールしました。
————————————————————————————————————————————
マスターが使用する Kaggle ケース リンク:
https://www.kaggle.com/code/yunsuxiaozi/learn-to-use-the-optuna/notebook
ポータル
コピペは楽しいですが、雰囲気と細部の感覚を保つために、時間に余裕があれば、たとえそれに従って入力しても、コピペよりもゆっくり手書きすることをお勧めします。直接貼り付けます。初めてスキルを習得するときは、遅い方が早いのです。
同様に、コンピューターに Anaconda がある場合、競合を防ぐために、Optuna をテストするための特別な仮想環境を構築することをお勧めします。
————————————————————————————————————————————
CSDN マスターの conda 仮想環境の構築と jupyter 仮想環境の構成チュートリアル:
https://blog.csdn.net/fanstering/article/details/123459665
Anaconda をお持ちでない場合は、この手順をスキップできます
仮想環境を確立するこの手順はすでに理解していますが、この専門家のチュートリアルに従ってインストールした場合、Jupyter は依然として Optuna ライブラリが存在しないと報告します。コンダ問題は後で解決されます。
————————————————————————————————————————————
次に、コードを記述するおなじみのプロセスに入ります。まず、必要な Python ライブラリをインポートし、不足しているものをインストールします。 pip install と conda install の両方を使用できます。Anaconda では後者を推奨します。
彼が幽霊のようなエラーを報告した場合: TqdmWarning: IProgress が見つかりません。jupyter と ipywidgets を更新してください。https://ipywidgets.read を参照してください。
ジェブ
心配する必要はありません。Jupyter をアップグレードするだけです。
最初の 3 つのステップを完了した後、プログラムのこのステップを更新して実行しましたが、すべて問題ありませんでした。
————————————————————————————————
データセットのダウンロードリンク: https://www.kaggle.com/competitions/titanic/data?select=train.csv
ポータル
total_df['Embarked_is_nan']=(total_df['Embarked']!=total_df['Embarked'])
このコード行は、新しい列「Embarked_is_nan」を作成します。これは、「Embarked」列で null 値 (NaN) をマークするために使用されます。 「Embarked」列の要素がそれ自体ではない場合 (つまり、要素が NaN である場合)、新しい列の対応する位置は True に設定されます。
このような書き込みは初めて見ました。
keys=['Pclass','Sex','SibSp','Parch']
for key in keys:
values=np.unique(train_df[key].values)
if len(values)<10 and key!="Survived":
print(f"key:{key},values:{values}")
key_target=train_df['Survived'].groupby([train_df[key]]).mean()
keys=key_target.keys().values
target=key_target.values
key_target=pd.DataFrame({key:keys,key+"_target":target})
total_df=pd.merge(total_df,key_target,on=key,how="left")
total_df.head()
このコードは少し複雑です。最初に 4 つの重要な機能 ['Pclass'、'Sex'、'SibSp'、'Parch'] を除外し、これらの列はキー リストに格納される可能性があります。乗客の生存状況。
次に、リストを 1 つずつ繰り返して、トレーニング セット内に各特徴が持つ一意の値の数を確認します。
キー列の一意の値 len (値) の数が 10 未満の場合、コードはこの列と生存状況との関係をさらに分析します。
(なぜ key!=「Survived」が強調されるのか少し混乱しています。このキーのリストには「Survived」の値がありません??)
これを印刷すると、4 つの属性がすべて条件を満たしていることがわかります。
key_target=train_df['Survived'].groupby([train_df[key]]).mean()
このステップでは、トレーニング セット train_df で、コードはキー リスト内の各一意の値に対応する「Survived」列の平均生存率を計算します。
図からわかるように、key_target データフレームの値は、各サイクルの key 属性の値に応じて変化します。たとえば、key = Pclass が処理される場合、key_target のキーは 1、2、3 であり、 value は対応する平均生存率; 処理 key = sex の場合、key_target のキーは「女性」と「男性」となり、値も対応する平均生存率になります。
以降の手順は、理解するために少し複雑です。
キーには合計 4 つの属性があり、そのうちの 1 つが各ケースに使用されます。最終的に、4 つの属性のデータが total_df に格納され、要約されて返されます。
これは PClass の場合です。PClass には 1/2/3 の 3 つの値があり、それぞれの値に対して平均生存率が計算され、key_target に格納されます。
次に、key_target のキーが取り出され、キー リストに保存されます (はい、このリストはキーとも呼ばれます...が、この時点ではその中の値は 3 つの値 1/ である必要があります) PClass の 2/3)、値がターゲット リスト (つまり、3 つの数値 0.629630、0.472826、0.242363) に格納され、キーと値の 2 つの列に人工的に名前が付けられます。キー列は PClass とも呼ばれます。 、値列はよりパーソナライズされており、「PClass_target」という名前にする必要があります。
類推すると、次の 3 つの属性の key_target はすべてこのルーチン内にありますが、total_df テーブルは常に拡張されています。
(ここの男性は範囲外の言葉です。写真は切り取られ、後で別の部分が追加されました)
最終的に total_df が大きなテーブルになるまで:
正直に言うと、パラメータ調整ツールの使い方を教えることが主な目的である Optuna の場合、このステップで原作者が書いたロジックは理解の負担が非常に大きくなりました...
私はキミに、画面を埋め尽くす非常に多くのキーとターゲットを混同しにくいように、このコードをより明確で単純なバージョンに書き直すように依頼しました。
この部分はパラメータ調整ステップの焦点ではありません。本当に理解できない場合はスキップしてください。 —————————————————————————————————————————
平均を使用して欠損値を埋めます。学習したデータ処理の一般的な手順にマークを付けます。
補足: 以前にデータ分析と Tableau 視覚化のコースを受講したとき、教師はさまざまなタイプの欠落データと処理方法を具体的に紹介する投稿を共有しました: https://towardsdatascience.com/all-about-missing-data-handling- b94b8b5d2184
リンクの説明を追加する
投稿は英語であり、閲覧するには登録してログインする必要があります。
————————————————————————————————————————————
より包括的な属性を含むデータ セット total_df を取得した後、以前の長さに応じてトレーニング セットとテスト セットに再度分割されます。
————————————————————————————————————————————
ここで、トレーニング セットとテスト セットの比率が 8:2、つまり 4:1 であることが述べられていますが、これは非常に一般的な分割比率です。
おそらく原作者はtestとvalidを同じものと考えていたため、特に区別して命名したわけではありません。
しかし、実際には、これら 2 つの概念はまったく同じではありません (ただし、区別が厳密でない場合もあります)。ここでは、test_X と test_y の統一された記述方法を使用します。
————————————————————————————————————————————
輸入LGBM 回帰者タイタニック号のデータセットは主に分類問題 (乗客が生き残るかどうかの予測) に使用されますが、原作者はここではそれを回帰問題として扱います。初心者にとっては、回帰や分類問題の詳細は気にせず、シンプルで親しみやすいデータセットとビデオ解説を備えたチュートリアルを選択することで始めやすいと考えました。このプロセスに熟練すると、より複雑で標準化されたデータをオンラインで見つけて練習できるようになります。
補足学習リンク:「LGBMRegressor パラメーター設定 lgbmclassifier パラメーター」
https://blog.51cto.com/u_12219/10333606
リンクの説明を追加する
(ところで、この投稿には LGBM 分類子はありませんか?なぜ著者はビデオの中で回帰問題の扱いについて特に言及したのですか?)
————————————————————————————————————————————
損失関数、つまり評価指標としてのRMSEは、二乗平均平方根誤差(Root Mean Square Error)を計算するPython関数です。小さいほど良い。
————————————————————————————————————————————
元の作成者のビデオ説明に従って、タスク目標のパラメータを設定します。
特定のパラメーターの名前、意味、推奨値については、上記の補足学習投稿「LGBMRegressor パラメーターの設定 lgbmclassifier パラメーター」を参照してください。
def objective(trial):
param = {
'metric':'rmse',
'random_state':trial.suggest_int('random_state', 2023, 2023), #随机种子固定,所以设置为2023-2023
'n_estimators':trial.suggest_int('n_estimators', 50, 300), #迭代器数量 50-300 的整数
'reg_alpha':trial.suggest_loguniform('reg_alpha', 1e-3, 10.0),
'reg_lambda':trial.suggest_loguniform('reg_lambda', 1e-3, 10.0), #对数正态分布的建议值
'colsample_bytree':trial.suggest_float('colsample_bytree', 0.5, 1), #浮点数
'subsample':trial.suggest_float('subsample', 0.5, 1),
'learning_rate':trial.suggest_float('learning_rate', 1e-4, 0.1, log = True),
'num_leaves':trial.suggest_int('num_leaves', 8, 64), #整数
'min_child_samples':trial.suggest_int('min_child_smaples', 1, 100),
}
model = LGBMRegressor(**param) #调用模型
model.fit(train_X, train_y, eval_set = [(test_X, test_y)], early_stopping_rounds = 100, verbose = False) #拟合
preds = model.predict(test_X) #计算测试集的损失
rmse = RMSE(test_y, preds)
return rmse
————————————————————————————————————————————
キーコード: Optuna を呼び出し、学習タスクを作成し、最小損失を指定して、タスク名を設定します。
#创建的研究命名,找最小值
study = optuna.create_study(direction = 'minimize', study_name = 'Optimize boosting hpyerparameters') #创建了一个Optuna研究对象,用于优化超参数。
#关键代码:调用Optuna,创建一个学习任务,指定让损失最小,设置任务名称。
#目标函数,尝试的次数
study.optimize(objective, n_trials = 100) #将设定好参数的object任务传进来,尝试一百次
#输出最佳的参数
print('Best Trial: ',study.best_trial.params) #找到最佳参数 tudy.best_trial 表示在所有尝试中损失最小的那次试验,params 是一个字典,包含了那次试验中使用的超参数。
lgbm_params = study.best_trial.params #这行代码将最佳参数赋值给 lgbm_params 变量。这样可以将这些参数用于LightGBM模型或其他需要这些超参数的模型。
————————————————————————————————————————————
このアイデアは問題ありませんが、奇妙なエラーが発生しました。fit() が予期しないキーワード引数 'early_stopping_rounds' を取得しました。
kimi の方法は試してもエラーが報告されたため、おそらく責任を負うべきは私たちではありません。
StackFlow のマスターは 2 つのソリューションを提供します。
https://stackoverflow.com/questions/76895269/lgbmclassifier-fit-got-an-unexpected-keyword-argument-early-stopping-rounds
ポータル
pip install を使用するのが最善ですが、conda install はインストールできないようです。
しかし、それは役に立たないことがわかりました...依然として同じエラーが発生し、early_stopping_roundsを認識せず、削除した後でも、次のパラメータverboseを認識しませんでした...
前回の補足によるとパラメータの変更は出来ないようです、情報の更新が遅れているようです…。
————————————————————————————————————————————
検索プロセス中に、エラーが発生しやすい点も見つかりました。early_stopping_rounds には最大制限が 100 しかないようです。
https://blog.csdn.net/ヤンティンティン/article/details/120708391
ポータル
————————————————————————————————————————————
インターネットで手動で検索したり、キミに尋ねたりしましたが、あまり効果的な代替手段はまだ見つかりません。今回は主に Optuna の使い方を試したいので、まずこの 2 つの面倒なパラメータを削除します。
model.fit(train_X, train_y, eval_set=[(test_X, test_y)]) #拟合
完全な目的コード:
def objective(trial):
param = {
'metric':'rmse',
'random_state':trial.suggest_int('random_state', 2023, 2023), #随机种子固定,所以设置为2023-2023
'n_estimators':trial.suggest_int('n_estimators', 50, 300), #迭代器数量 50-300 的整数
'reg_alpha':trial.suggest_loguniform('reg_alpha', 1e-3, 10.0),
'reg_lambda':trial.suggest_loguniform('reg_lambda', 1e-3, 10.0), #对数正态分布的建议值
'colsample_bytree':trial.suggest_float('colsample_bytree', 0.5, 1), #浮点数
'subsample':trial.suggest_float('subsample', 0.5, 1),
'learning_rate':trial.suggest_float('learning_rate', 1e-4, 0.1, log = True),
'num_leaves':trial.suggest_int('num_leaves', 8, 64), #整数
'min_child_samples':trial.suggest_int('min_child_smaples', 1, 100),
}
model = LGBMRegressor(**param) #调用模型
model.fit(train_X, train_y, eval_set=[(test_X, test_y)]) #拟合
preds = model.predict(test_X) #计算测试集的损失
rmse = RMSE(test_y, preds)
return rmse
そうすれば、できますGetBest_Trial得たもの:
————————————————————————————————————————————
同様にオリジナルUPも使用xgboost と catboost同様の方法を使用して、最適なパラメーターを見つけます。
3 つの異なるメソッドの主な違いは、選択されたパラメーター param とモデルによって指定された関数メソッドであることを理解するのは難しくありません。
XGBoost:
XGBoost の結果:
————————————————————————————————————————————
キャットブースト:
CatBoost の結果:
————————————————————————————————————————————
最後に使用したK分割相互検証最良の結果を得る:
相互検証も機械学習でよく使用される用語です。
def accuracy(y_true, y_pred):
return np.sum(y_true == y_pred)/len(y_true)
kf は KFold オブジェクトであり、K フォールド相互検証を実装するための scikit-learn ライブラリ内のツールです。 KFold はデータセットを次のように分割します。n_splits サブセット、各サブセット検証セットとして交代で参加する、残りはトレーニング セットとして機能します。
kf.split(x) の train_index、valid_index の場合: このコード行は KFold オブジェクトを反復処理し、反復ごとに 2 つの配列 (train_index と valid_index) を返します。train_index にはトレーニングに使用されるデータ ポイントのインデックスが含まれ、valid_index には検証に使用されるデータ ポイントのインデックスが含まれます。 。完全なセット X、y のインデックスに従って、毎回トレーニング セットと検証セットのデータを取得できます。このプロセスは、クラス全体を混乱させ、毎回数人の生徒をランダムに選択して生徒のグループを呼び出すようなものです。
————————————————————————————————————————————
さて、別のよくあるバグに遭遇しましたが、それがどのように起こったのかはわかりませんが、Python が再び責任を負うべきかどうかはわかりません。 (X および Y データ セットの形状は作成者が以前に作成したものとまったく同じであるため、論理的には後でそれらに対して他の操作は行われません...)
問題が発生しても恐れることなく、解決してください。これに関してはキミを信頼する必要があります! (ちなみに、インターン先の人工知能会社の社員もKimiを使っているので、比較的信頼できて無料です!!)
別のエラーの発生を避けるために、early_stopping_rounds パラメータとverbose パラメータを同時に無効にすることを忘れないでください。
このコードは比較的長く、繰り返しが多いので、間違えないように注意してください。
from sklearn.model_selection import KFold #在机器学习库中导入k折交叉验证的函数
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
from catboost import CatBoostRegressor
def accuracy(y_true,y_pred):
return np.sum(y_true==y_pred)/len(y_true)
print("start fit.")
folds = 10 #将数据分成10份
y=train_df['Survived']
X=train_df.drop(['Survived'],axis=1)
train_accuracy=[]
valid_accuracy=[]
# 存储已学习模型的列表
models = []
#将数据集随机打乱,并分成folds份
kf = KFold(n_splits=folds, shuffle=True, random_state=2023)
#从x_train中按照9:1的比例分成训练集和验证集,并取出下标
for train_index, valid_index in kf.split(X):
#根据下标取出训练集和验证集的数据
x_train_cv = X.iloc[train_index]
y_train_cv = y.iloc[train_index]
x_valid_cv =X.iloc[valid_index]
y_valid_cv = y.iloc[valid_index]
model = LGBMRegressor(**lgbm_params)
#模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
model.fit(
x_train_cv,
y_train_cv,
eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)],
#early_stopping_rounds=100,
#verbose = 100, #迭代100次输出一个结果
)
#对训练集进行预测
y_pred_train = model.predict(x_train_cv)
#对验证集进行预测
y_pred_valid = model.predict(x_valid_cv)
y_pred_train=(y_pred_train>=0.5)
y_pred_valid=(y_pred_valid>=0.5)
train_acc=accuracy(y_pred_train,y_train_cv)
valid_acc=accuracy(y_pred_valid,y_valid_cv)
train_accuracy.append(train_acc)
valid_accuracy.append(valid_acc)
#将model保存进列表中
models.append(model)
model = XGBRegressor(**xgb_params)
#模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
model.fit(
x_train_cv,
y_train_cv,
eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)],
#early_stopping_rounds=100,
#verbose = 100, #迭代100次输出一个结果
)
#对训练集进行预测
y_pred_train = model.predict(x_train_cv)
#对验证集进行预测
y_pred_valid = model.predict(x_valid_cv)
y_pred_train=(y_pred_train>=0.5)
y_pred_valid=(y_pred_valid>=0.5)
train_acc=accuracy(y_pred_train,y_train_cv)
valid_acc=accuracy(y_pred_valid,y_valid_cv)
train_accuracy.append(train_acc)
valid_accuracy.append(valid_acc)
#将model保存进列表中
models.append(model)
model = CatBoostRegressor(**cat_params)
#模型用x_train_cv去训练,用x_train_cv和x_valid_cv一起去评估
model.fit(
x_train_cv,
y_train_cv,
eval_set = [(x_train_cv, y_train_cv), (x_valid_cv, y_valid_cv)],
#early_stopping_rounds=100,
#verbose = 100, #迭代100次输出一个结果
)
#对训练集进行预测
y_pred_train = model.predict(x_train_cv)
#对验证集进行预测
y_pred_valid = model.predict(x_valid_cv)
y_pred_train=(y_pred_train>=0.5)
y_pred_valid=(y_pred_valid>=0.5)
train_acc=accuracy(y_pred_train,y_train_cv)
valid_acc=accuracy(y_pred_valid,y_valid_cv)
train_accuracy.append(train_acc)
valid_accuracy.append(valid_acc)
#将model保存进列表中
models.append(model)
print(f"train_accuracy:{train_accuracy}, valid_accuracy:{valid_accuracy}")
train_accuracy=np.array(train_accuracy)
valid_accuracy=np.array(valid_accuracy)
print(f"mean_train_accuracy: {np.mean(train_accuracy)}")
print(f"mean_valid_accuracy: {np.mean(valid_accuracy)}")
私と元の著者の間の中間出力は多少異なります。ギャップの原因はわかりません。
しかし幸いなことに、今のところ結果はそれほど悪くないようです。
————————————————————————————————————————————
テスト セットで各モデルのパフォーマンスをテストします。
test_X = test_df.drop(['Survived'], axis = 1).values
preds_test = []
#用每个保存的模型都对x_test预测一次,然后取平均值
for model in models:
pred = model.predict(test_X)
preds_test.append(pred)
#将预测结果转换为np.array
preds_test_np = np.array(preds_test)
#按行对每个模型的预测结果取平均值
test_pred= preds_test_np.mean(axis = 0 )
test_pred=(test_pred >= 0.5).astype(np.int64)
#平均预测值与 0.5 进行比较,根据比较结果(大于等于 0.5 为 True,否则为 False)将每个值转换为二进制形式(即 1 或 0),然后使用 astype(np.int64) 将布尔值转换为 64 位整数类型。
test_pred
出力 test_pred.shape を見てください。配列の正方形の形状ではなく、418 個の要素を含む 1 次元の配列として見てください。
Python では、1 次元配列の形状は通常 (N,) として表されます。ここで、N は配列内の要素の総数です。
————————————————————————————————————————————
test_pred=(test_pred >= 0.5).astype(np.int64) という文で使用されているように、新しい列を作成し、サイズを比較して True または False の Bool 値を割り当てる例が多数あります。プロジェクト:
————————————————————————————————————————————
最後に、CSV ファイルに保存して書き込みます。
submission=pd.read_csv("D:/StudyFiles/Optuna_Titanic/data/gender_submission.csv") #读取CSV文件,并将其存储在变量submission中
submission['Survived']=test_pred #更新了submission DataFrame中的'Survived'列,使其包含模型预测的生存概率或分类结果。
submission.to_csv("submission.csv",index=None) #将更新后的submission DataFrame保存为一个新的CSV文件"submission.csv"。参数index=None表示在保存CSV文件时不包括行索引。
submission.head()
————————————————————————————————————————————
私のコード パッケージを CSDN ホームページに送信しますので、必要な方はご自身でダウンロードしてください。
————————————————————————————————————————————
その他の関連学習コンテンツ:
(1) **9.1 モデルのパラメーター調整 [Stanford 21 Fall: Practical Machine Learning Chinese Edition]: **Li Mu 先生のビデオでパラメーター調整に関するいくつかの理論が紹介されています。パラメーター調整がわからない場合は、それを見て学ぶことができます。基本知識。 。
https://www.bilibili.com/video/BV1vQ4y1e7LF/?spm_id_from=333.788.recommend_more_video.1&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
ポータル
(二)この高麗人参自動調整ツールは本当に強力すぎます。機械学習やディープラーニングのパラメータ調整の日常的な使用に完全に対応できます。初心者必見のツールです!: ビデオの内容は、私がフォローしたデモビデオほど良くはありませんが、主に Optuna について簡単に説明しており、実際の事例はありません。
https://www.bilibili.com/video/BV1Zs421K7Qj/?spm_id_from=333.788.recommend_more_video.6&vd_source=cdfd0a0810bcc0bcdbcf373dafdf6a82
ポータル
しかし、この UP で紹介されている本には非常に興味があります。なぜなら、経験がなく、ルールを見つけるのが好きな私のような初心者にとって、普遍的な公式や方向性を紹介できるガイドブックがあればいいのにと思っているからです。