Python解析參數的三種方法

今天我們分享的主要目的就是通過在 Python 中使用命令行和配置文件來提高代碼的效率 Let's go! 我們以機器學習當中的調參過程來進行實踐,有三種方式可供選擇刻盐。第一個選項是使用 argparse掏膏,它是一個流行的 Python 模塊,專門用于命令行解析敦锌;另一種方法是讀取 JSON 文件馒疹,我們可以在其中放置所有超參數;第三種也是鮮為人知的方法是使用 YAML 文件乙墙! 好奇嗎颖变,讓我們開始吧! ## 先決條件 在下面的代碼中听想,我將使用 Visual Studio Code腥刹,這是一個非常高效的集成 Python 開發(fā)環(huán)境。這個工具的美妙之處在于它通過安裝擴展支持每種編程語言汉买,集成終端并允許同時處理大量 Python 腳本和 Jupyter 筆記本 當然如果你還不知道怎么配置 VSCode衔峰,可以看這里 手把手將Visual Studio Code變成Python開發(fā)神器 數據集,使用的是 Kaggle 上的共享自行車數據集,可以在這里下載或者在文末獲取 > https://www.kaggle.com/datasets/lakshmi25npathi/bike-sharing-dataset ## 使用 argparse ![](https://upload-images.jianshu.io/upload_images/5803165-f88d2fe82c637249.png) 就像上圖所示垫卤,我們有一個標準的結構來組織我們的小項目: - 包含我們數據集的名為 data 的文件夾 - train.py 文件 - 用于指定超參數的 options.py 文件 首先威彰,我們可以創(chuàng)建一個文件 train.py,在其中我們有導入數據穴肘、在訓練數據上訓練模型并在測試集上對其進行評估的基本程序: ```Python import pandas as pd import numpy as np from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.metrics import mean_squared_error, mean_absolute_error from options import train_options df = pd.read_csv('data\hour.csv') print(df.head()) opt = train_options() X=df.drop(['instant','dteday','atemp','casual','registered','cnt'],axis=1).values y =df['cnt'].values X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) if opt.normalize == True: scaler = StandardScaler() X = scaler.fit_transform(X) rf = RandomForestRegressor(n_estimators=opt.n_estimators,max_features=opt.max_features,max_depth=opt.max_depth) model = rf.fit(X_train,y_train) y_pred = model.predict(X_test) rmse = np.sqrt(mean_squared_error(y_pred, y_test)) mae = mean_absolute_error(y_pred, y_test) print("rmse: ",rmse) print("mae: ",mae) ``` 在代碼中歇盼,我們還導入了包含在 options.py 文件中的 train_options 函數。后一個文件是一個 Python 文件评抚,我們可以從中更改 train.py 中考慮的超參數: ```Python import argparse def train_options(): parser = argparse.ArgumentParser() parser.add_argument("--normalize", default=True, type=bool, help='maximum depth') parser.add_argument("--n_estimators", default=100, type=int, help='number of estimators') parser.add_argument("--max_features", default=6, type=int, help='maximum of features',) parser.add_argument("--max_depth", default=5, type=int,help='maximum depth') opt = parser.parse_args() return opt ``` 在這個例子中豹缀,我們使用了 argparse 庫,它在解析命令行參數時非常流行慨代。首先邢笙,我們初始化解析器,然后鱼响,我們可以添加我們想要訪問的參數鸣剪。 這是運行代碼的示例: ```Python python train.py ``` ![](https://upload-images.jianshu.io/upload_images/5803165-bc2853f09594192e.png) 要更改超參數的默認值,有兩種方法丈积。第一個選項是在 options.py 文件中設置不同的默認值筐骇。另一種選擇是從命令行傳遞超參數值: ```Python python train.py --n_estimators 200 ``` 我們需要指定要更改的超參數的名稱和相應的值。 ```Python python train.py --n_estimators 200 --max_depth 7 ``` ## 使用 JSON 文件 ![](https://upload-images.jianshu.io/upload_images/5803165-ad58a32cd1613757.png) 和前面一樣江滨,我們可以保持類似的文件結構铛纬。在這種情況下,我們將 options.py 文件替換為 JSON 文件唬滑。換句話說告唆,我們想在 JSON 文件中指定超參數的值并將它們傳遞給 train.py 文件。與 argparse 庫相比晶密,JSON 文件可以是一種快速且直觀的替代方案擒悬,它利用鍵值對來存儲數據。下面我們創(chuàng)建一個 options.json 文件稻艰,其中包含我們稍后需要傳遞給其他代碼的數據懂牧。 ```JSON { "normalize":true, "n_estimators":100, "max_features":6, "max_depth":5 } ``` 如上所見,它與 Python 字典非常相似尊勿。但是與字典不同的是僧凤,它包含文本/字符串格式的數據。此外元扔,還有一些語法略有不同的常見數據類型躯保。例如,布爾值是 false/true澎语,而 Python 識別 False/True途事。JSON 中其他可能的值是數組验懊,它們用方括號表示為 Python 列表。 在 Python 中使用 JSON 數據的美妙之處在于盯孙,它可以通過 load 方法轉換成 Python 字典: ```Python f = open("options.json", "rb") parameters = json.load(f) ``` 要訪問特定項目鲁森,我們只需要在方括號內引用它的鍵名: ```Python if parameters["normalize"] == True: scaler = StandardScaler() X = scaler.fit_transform(X) rf=RandomForestRegressor(n_estimators=parameters["n_estimators"],max_features=parameters["max_features"],max_depth=parameters["max_depth"],random_state=42) model = rf.fit(X_train,y_train) y_pred = model.predict(X_test) ``` ## 使用 YAML 文件 ![](https://upload-images.jianshu.io/upload_images/5803165-c767e74cf988001d.png) 最后一種選擇是利用 YAML 的潛力。與 JSON 文件一樣振惰,我們將 Python 代碼中的 YAML 文件作為字典讀取,以訪問超參數的值垄懂。YAML 是一種人類可讀的數據表示語言骑晶,其中層次結構使用雙空格字符表示,而不是像 JSON 文件中的括號草慧。下面我們展示 options.yaml 文件將包含的內容: ```YAML normalize: True n_estimators: 100 max_features: 6 max_depth: 5 ``` 在 train.py 中桶蛔,我們打開 options.yaml 文件,該文件將始終使用 load 方法轉換為 Python 字典漫谷,這一次是從 yaml 庫中導入的: ```Python import yaml f = open('options.yaml','rb') parameters = yaml.load(f, Loader=yaml.FullLoader) ``` 和前面一樣仔雷,我們可以使用字典所需的語法訪問超參數的值。 ## 最后的想法 配置文件的編譯速度非程蚴荆快,而 argparse 則需要為我們要添加的每個參數編寫一行代碼。 所以我們應該根據自己的不同情況來選擇最為合適的方式 例如任岸,如果我們需要為參數添加注釋纤虽,JSON 是不合適的,因為它不允許注釋俺祠,而 YAML 和 argparse 可能非常適合公给。 好了,這就是今天分享的全部內容蜘渣,喜歡就點個贊吧~ 本文由[mdnice](https://mdnice.com/?platform=6)多平臺發(fā)布
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末淌铐,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子蔫缸,更是在濱河造成了極大的恐慌腿准,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捂龄,死亡現場離奇詭異释涛,居然都是意外死亡,警方通過查閱死者的電腦和手機倦沧,發(fā)現死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門唇撬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人展融,你說我怎么就攤上這事窖认。” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵扑浸,是天一觀的道長烧给。 經常有香客問我,道長喝噪,這世上最難降的妖魔是什么础嫡? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮酝惧,結果婚禮上榴鼎,老公的妹妹穿的比我還像新娘。我一直安慰自己晚唇,他們只是感情好巫财,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著哩陕,像睡著了一般平项。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上悍及,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天闽瓢,我揣著相機與錄音,去河邊找鬼并鸵。 笑死鸳粉,一個胖子當著我的面吹牛,可吹牛的內容都是我干的园担。 我是一名探鬼主播届谈,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼弯汰!你這毒婦竟也來了艰山?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤咏闪,失蹤者是張志新(化名)和其女友劉穎曙搬,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體鸽嫂,經...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡纵装,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了据某。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片橡娄。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖癣籽,靈堂內的尸體忽然破棺而出挽唉,到底是詐尸還是另有隱情滤祖,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布瓶籽,位于F島的核電站匠童,受9級特大地震影響,放射性物質發(fā)生泄漏塑顺。R本人自食惡果不足惜汤求,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望严拒。 院中可真熱鬧首昔,春花似錦、人聲如沸糙俗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽巧骚。三九已至,卻和暖如春格二,著一層夾襖步出監(jiān)牢的瞬間劈彪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工顶猜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留沧奴,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓长窄,卻偏偏與公主長得像滔吠,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挠日,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內容