AI
假设需要执行一项回归机器学习项目。已经分析了数据,进行了一些数据清洗,创建了一些虚拟变量,现在,是时候运行机器学习回归模型了。想到的十大模型有哪些?大多数人可能都不知道有“十大回归模型”。如果不知道,也不必担心,因为在本文的最后,不仅可以运行 10 个机器学习回归模型,而且能运行 40 多个机器学习回归模型。
现在要在一个回归项目测试 Lazy Predict。因此,使用典型的西雅图房价数据集,在 Kaggle 上就能找到。

Lazy Predict 是什么?

不需要很多代码,Lazy Predict 就能帮助构建几十个模型,并帮助了解哪些模型在不经过任何参数调整的情况下工作得更好。说明其工作原理的最好方法就是使用一个小项目,现在就开始吧。

回归项目使用 Lazy Predict

首先,要安装 Lazy Predict,可以pip install lazypredict回归项目到终端。接下来,导入一些用于本项目的库。

  1. # Importing important libraries
  2. import pyforest
  3. from lazypredict.Supervised import LazyRegressor
  4. from pandas.plotting import scatter_matrix
  5. # Scikit-learn packages
  6. from sklearn.linear_model import LinearRegression
  7. from sklearn.tree import DecisionTreeRegressor
  8. from sklearn.ensemble import ExtraTreesRegressor
  9. from sklearn import metrics
  10. from sklearn.metrics import mean_squared_error
  11. # Hide warnings
  12. import warnings
  13. warnings.filterwarnings(“ignore”)
  14. # Setting up max columns displayed to 100
  15. pd.options.display.max_columns = 100

可以看到导入了pyforest而非 Pandas 和 Numpy。在 Notebook 中,PyForest 可以非常快速地导入所有重要的库。

  1. # Import dataset
  2. df = pd.read_csv('../data/kc_house_data_train.csv', index_col=0)

看看这个数据集是什么样子。
2021-05-15-14-06-34-146766.jpeg
下面来检查一下数据类型。

  1. # Checking datatimes and null values
  2. df.info()

2021-05-15-14-06-34-244109.jpeg
下面是吸引注意力的几件事情。第一件是id列与这个小项目没有任何关联。但是,如果想更深入地研究这个项目,应该检查是否存在重复项。另外,date列是一个对象类型。应将其改为 DateTime 类型。这些列中的zipcode,lat和long可能与价格几乎或者根本没有关联。然而,因为本项目的目标是演示lazy predict,所以要保留它们。
接下来,在运行第一个模型之前,检查一些统计数据,以找出需要修改的地方。
2021-05-15-14-06-34-339126.jpeg
看到了一些有趣的事情。首先,有一所房子有 33 间卧室,那不可能是真的。所以在网上查了一下,结果发现用它的id找到了这套房子,它实际上有 3 间卧室。此外,有些房子看上去没有卫生间。会包括至少 1 个卫生间,这样就可以完成数据清理了。

  1. # Fixing house with 33 bedrooms
  2. df[df['bedrooms'] == 33] = df[df['bedrooms'] == 3]
  3. # This will add 1 bathroom to houses without any bathroom
  4. df['bathrooms'] = df.bedrooms.apply(lambda x: 1 if x < 1 else x)

拆分训练集和测试集

现在可以拆分训练集和测试集了。但是在此之前,确保代码不会出现nan或infinite的值。

  1. # Removing nan and infinite values
  2. df.replace([np.inf, -np.inf], np.nan, inplace=True)
  3. df.dropna(inplace=True)

现在将数据集分为 X 和 Y 两个变量。给训练集分配 75% 的数据集,给测试集 25%。

  1. # Creating train test split
  2. X = df.drop(columns=['price])
  3. y = df.price
  4. # Call train_test_split on the data and capture the results
  5. X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=3,test_size=0.25)

下面的代码将运行 40 多个模型,并显示每个模型的 R-Squared 和 RMSE。做好准备,开始!

  1. reg = LazyRegressor(ignore_warnings=False, custom_metric=None)
  2. models, predictions = reg.fit(X_train, X_test, y_train, y_test)
  3. print(models)

2021-05-15-14-06-34-466068.jpeg
对于花费在上面的工作来说,这些结果非常好。对普通模型而言,这些都是非常好的 R-Squared 和 RMSE。运行了 41 个普通模型,并且得到了需要的指标,可以看到每个模型所花费的时间。一点也不差。那么,如何确定这些结果是否正确呢?通过运行一个模型,可以查看结果,看它是否和得到的结果相近。要不要测试一下基于直方图的梯度提升回归树。

复核结果

首先,用 scikit-learn 导入这个模型。

  1. # Explicitly require this experimental feature
  2. from sklearn.experimental import enable_hist_gradient_boosting
  3. # Now you can import normally from ensemble
  4. from sklearn.ensemble import HistGradientBoostingRegressor

此外,还创建了一个函数来检查模型的度量。

  1. # Evaluation Functions
  2. def rmse(model, y_test, y_pred, X_train, y_train):
  3. r_squared = model.score(X_test, y_test)
  4. mse = mean_squared_error(y_test, y_pred)
  5. rmse = np.sqrt(mse)
  6. print(‘R-squared: + str(r_squared))
  7. print(‘Mean Squared Error: ‘+ str(rmse))
  8. # Create model line scatter plot
  9. def scatter_plot(y_test, y_pred, model_name):
  10. plt.figure(figsize=(10,6))
  11. sns.residplot(y_test, y_pred, lowess=True, color='#4682b4',
  12. line_kws={'lw': 2, 'color': 'r'})
  13. plt.title(str('Price vs Residuals for '+ model_name))
  14. plt.xlabel('Price',fontsize=16)
  15. plt.xticks(fontsize=13)
  16. plt.yticks(fontsize=13)
  17. plt.show()

最后,来运行这个模型并查看结果。

  1. # Histogram-based Gradient Boosting Regression Tree
  2. hist = HistGradientBoostingRegressor()
  3. hist.fit(X_train, y_train)
  4. y_pred = hist.predict(X_test)

2021-05-15-14-06-34-582955.jpeg
用 Lazy Predict 得到的结果和这个结果非常接近。看来这确实很管用。

最后想法

Lazy Predict 是一个神奇的库,易于使用,并且非常快速,只需要很少的代码就可以运行普通模型。可以使用 2 到 3 行的代码来手动设置,而不需要手工设置多个普通模型。切记,不要把结果作为最终的模型,应该始终对结果进行复核,以确保库工作正常。数据科学是一个复杂的领域,Lazy Predict 并不能取代那些优化模型的专业人员的专业知识。