logo
Loading...

mlxtend和sklearn套件的差異? - Cupoy

mlxtend和sklearn套件都可以實現stacking的功能。但在使用相同資料集(Iris資料...

mlxtend和sklearn套件的差異?

2023/09/03 下午 11:53
集成方法 : 堆疊泛化(Stacking)
A. Hung
觀看數:14
回答數:1
收藏數:0

mlxtend和sklearn套件都可以實現stacking的功能。但在使用相同資料集(Iris資料集),使用相同特徵預測相同目標變數,以相同的random_state切分測試集與訓練集,並使用相同的基礎模型與元模型,所有的基礎模型與元模型的參數與隨機性(random_state)也都相同。最終得出的測試集MSE卻不相同,是因為什麼原因呢? 以下附上程式碼 # sklearn ```python # 載入套件 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import StackingRegressor # 堆疊泛化函式 from sklearn.metrics import mean_squared_error # 載入Iris資料庫 iris = load_iris() X, y = iris.data, iris.target # 使用 'sepal length (cm)', 'sepal width (cm)', 和 'petal width (cm)' 作為特徵 X = X[:, [0, 1, 3]] # sepal length, sepal width, petal width # 使用 'petal length (cm)' 作為目標變數 y = iris.data[:, 2] # petal length # 切分訓練資料集與測試資料集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定義基礎模型 base_models = [ ('RF', RandomForestRegressor(n_estimators=100, random_state=42)), ('LinearRegression', LinearRegression()) ] # 定義元模型 meta_model = DecisionTreeRegressor(random_state=42) # 使用 sklearn 的 StackinRegressor(),建立Stacking迴歸器 stacking_regressor = StackingRegressor(estimators = base_models, # 傳入基礎模型 final_estimator = meta_model # 傳入元模型 ) # 訓練Stacking迴歸器 stacking_regressor.fit(X_train, y_train) # 使用Stacking迴歸器進行預測 prediction_result = stacking_regressor.predict(X_test) # 評估模型性能 mse = mean_squared_error(y_test, prediction_result) print(f'堆疊泛化迴歸器的MSE: {mse:.2f}') ``` # mlxtend ```python # 載入套件 from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestRegressor from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from mlxtend.regressor import StackingRegressor # 堆疊泛化函式 from sklearn.metrics import mean_squared_error # 載入Iris資料庫 iris = load_iris() X, y = iris.data, iris.target # 使用 'sepal length (cm)', 'sepal width (cm)', 和 'petal width (cm)' 作為特徵 X = X[:, [0, 1, 3]] # 花萼長度、花萼寬度、花瓣寬度 # 使用 'petal length (cm)' 作為目標變數 y = iris.data[:, 2] # 花瓣長度 # 切分訓練資料集與測試資料集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 定義基礎模型 base_models = [ RandomForestRegressor(n_estimators=100, random_state=42), LinearRegression() ] # 定義元模型(堆疊器) meta_model = DecisionTreeRegressor(random_state=42) # 使用 mlxtend 的 StackinRegressor(),建立Stacking迴歸器 stacking_regressor = StackingRegressor(regressors = base_models, # 傳入基礎模型 meta_regressor = meta_model # 傳入元模型 ) # 訓練Stacking迴歸器 stacking_regressor.fit(X_train, y_train) # 使用Stacking迴歸器進行預測 y_pred = stacking_regressor.predict(X_test) # 評估模型性能 mse = mean_squared_error(y_test, y_pred) print(f'堆疊泛化迴歸器的MSE: {mse:.2f}') ``` 謝謝~

回答列表

  • 2023/09/06 下午 01:45
    王健安
    贊同數:0
    不贊同數:0
    留言數:1

    A. Hung 您好, mlxtend 是基於 sklearn 延伸而成的套件, 以補足 sklearn 沒有涵蓋的方法或呈現結果的方式, 「特徵挑選」就是典型 mlxtend 補齊 sklearn 的案例; 至於為何使用兩種演算法所得到的結果會不同, 我個人認為套件的不同導致運算有些微差異只是次要因素, 主要因素在於 Random Forest 跟 Linear Regression 演算法中都涵蓋「隨機」的成分, 意即當重複執行該程式碼時,模型預測結果不會完全相同, 建議您比較不同套件時, 要先把分析流程中有「隨機」的元素(例如:資料切割、具隨機成分的模型諸如隨機森林、線性迴歸等)排除, 才能公平比較。