我在尝试将自定义的 DecisionTreeRegressor 用于房价预测部署到 GCS Vertex AI。我所遵循的教程是针对 MPG 数据集教程 的
然而,当我尝试使用以下命令在本地构建和测试容器时:
docker build ./ -t $IMAGE_URIdocker run $IMAGE_URI
出现了错误消息:AttributeError: ‘DecisionTreeRegressor’ 对象没有 ‘save’ 属性
我运行的代码是 train.py:
# 导入此项目所需的库import numpy as npimport pandas as pdfrom sklearn.model_selection import ShuffleSplit# 加载波士顿房价数据集data = pd.read_csv('trainer/housing.csv')prices = data['MEDV']features = data.drop('MEDV', axis = 1)# 导入 'train_test_split'from sklearn.model_selection import train_test_split# 打乱并将数据分割成训练和测试子集X_train, X_test, y_train, y_test = train_test_split(features, prices, test_size=0.2, random_state = 42)# 定义模型拟合和调整函数# 导入 'make_scorer', 'DecisionTreeRegressor', 和 'GridSearchCV'from sklearn.tree import DecisionTreeRegressorfrom sklearn.metrics import make_scorerfrom sklearn.model_selection import GridSearchCVfrom sklearn.metrics import r2_score # 导入 'r2_score'from sklearn.metrics import accuracy_score# TODO: 将 `your-gcs-bucket` 替换为您之前创建的存储桶的名称BUCKET = 'gs://gardena-dps-bucket'def performance_metric(y_true, y_predict): """ 根据所选择的指标计算并返回真实值(y_true)和预测值(y_predict)之间的性能分数。 """ score = r2_score(y_true, y_predict) # 返回分数 return scoredef fit_model(X, y): """ 对输入数据 [X, y] 上的决策树回归器进行网格搜索,以调整 'max_depth' 参数。 """ # 从训练数据中创建交叉验证集 cv_sets = ShuffleSplit(n_splits = 10, test_size = 0.20, random_state = 0) # 创建决策树回归器对象 regressor = DecisionTreeRegressor() # 为参数 'max_depth' 创建一个从1到10的范围的字典 params = {'max_depth':[1,2,3,4,5,6,7,8,9,10]} # 使用 'make_scorer' 将 'performance_metric' 转换为评分函数 scoring_fnc = make_scorer(performance_metric) # 创建网格搜索 cv 对象 --> GridSearchCV() # 确保在对象中包含正确的参数: # (estimator, param_grid, scoring, cv),它们的值分别为 'regressor', 'params', 'scoring_fnc', 和 'cv_sets'。 grid = GridSearchCV(estimator=regressor, param_grid=params, scoring=scoring_fnc, cv=cv_sets) # 拟合网格搜索对象到数据以计算最优模型 grid = grid.fit(X, y) # 在拟合数据后返回最优模型 return grid.best_estimator_# 使用网格搜索拟合训练数据到模型reg = fit_model(X_train, y_train)# 为客户数据生成矩阵client_data = [[12, 26.3, 16.99885]] # 客户数据的二维数组# 显示预测reprice = reg.predict(client_data).astype(int)reprice# 导出模型并保存到 GCSreg.save(BUCKET + '/housing/model')
回答:
Scikit-learn 估计器不提供直接保存其状态的方法。根据 Google 文档,将拟合模型存储到 GCS 的最佳方式是使用 joblib
在本地序列化您的模型,然后将其上传到 GCS。
如下所示:
from google.cloud import storagefrom sklearn.externals import joblib# 将模型导出到文件model = 'model.joblib'joblib.dump(pipeline, model)# 上传模型到 GCSbucket = storage.Client().bucket(BUCKET_NAME)blob = bucket.blob('{}/{}'.format( datetime.datetime.now().strftime('model_%Y%m%d_%H%M%S'), model))blob.upload_from_filename(model)