周末补一下这星期机器学习的知识点🧀欢迎
别忘了点赞关注噢🎁🎁🎁
吹个水🤑
什么是管道(Pipeline)?😃
管道就是说,你在分析数据的时候可能会有好几个预处理、或者说你可能有好几个model,那么你每次想调用这个过程的时候,每次都要写这么多预处理和model的过程的话就显得很繁琐,所以这里出现了“管道”的概念,它把这些过程相当于封装起来了,你要调用的话,直接就用就行了,不需要再重复写预处理和model的过程😎😎😎
看案例😆
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
polynomial_features = PolynomialFeatures(degree=2)
linear_regression = LinearRegression()
pipeline = Pipeline([("polynomial_features", polynomial_features),
("linear_regression", linear_regression)])##重点
pipeline.fit(X_train, y_train)##直接就用它来fit()就行了
##用例:
train_score = pipeline.score(X_train, y_train)
cv_score = pipeline.score(X_test, y_test)
print('train_score: {0:0.6f}; cv_score: {1:.6f}'.format(train_score, cv_score))
就是如此的简单😁
参数🤪
pipeline的构建接受一个列表参数,列表中每个元组都包含两个元素,分别为转换器或者估计器的名字,和转换器或者估计器本身,注意:估计器只能放在pipeline的最后一个。名字用于使用pipeline进行字典访问。
基于管道(pipeline)的模型观察😍
以下例子和多项式回归有点关系的,因为它和degree有关,数据的话这里不方便展示了,大家看一下效果就行了,都是可以理解的了
n_dots = 200 ##随机种子
X = np.linspace(-2 * np.pi, 2 * np.pi, n_dots)
Y = np.sin(X) + 0.2 * np.random.rand(n_dots) - 0.1
X = X.reshape(-1, 1)
Y = Y.reshape(-1, 1);
第二步,写函数
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
def polynomial_model(degree=1):
polynomial_features = PolynomialFeatures(degree=degree)
linear_regression = LinearRegression()
pipeline = Pipeline([("polynomial_features", polynomial_features),
("linear_regression", linear_regression)])
return pipeline
第三步
from sklearn.metrics import mean_squared_error
degrees = [2, 3, 5, 10]
results = []
for d in degrees:
model = polynomial_model(degree=d)
model.fit(X, Y)
train_score = model.score(X, Y)
mse = mean_squared_error(Y, model.predict(X))
results.append({"model": model, "degree": d, "score": train_score, "mse": mse})
for r in results:
print("degree: {}; train score: {}; mean squared error: {}".format(r["degree"], r["score"], r["mse"]))
结果:
第四步,看效果图
from matplotlib.figure import SubplotParams
plt.figure(figsize=(12, 6), dpi=200, subplotpars=SubplotParams(hspace=0.3))
for i, r in enumerate(results):
fig = plt.subplot(2, 2, i+1)
plt.xlim(-8, 8)
plt.title("LinearRegression degree={}".format(r["degree"]))
plt.scatter(X, Y, s=5, c='b', alpha=0.5)
plt.plot(X, r["model"].predict(X), 'r-')
可以看到degree的值越高,那么拟合的最终效果就越好,也就是可以理解成,预处理的次数越多,效果越好,当然这不是绝对的,不是预处理做的越多,效果就越好的,有时候degree=1的效果可能比10的效果还好,这个东西是不确定的!!!