PolynomialFeatures用来生成关于X的矩阵,其中degree表示多项式的次数,include_bias默认为True,表示会包含1
使用多项式的方法,来对特征进行构造;如果有a,b两个特征,那么它的2次多项式为(1,a,b,a^2,ab, b^2)
from sklearn.preprocessing import PolynomialFeatures
sklearn.preprocessing.PolynomialFeatures(degree=2, *, interaction_only=False,
include_bias=True, order='C')
- Parameters(参数)
degree : int, default=2
多项式特征的次数
interaction_only : bool, default=False
如果指定为True,那么就不会有特征自己和自己结合的项,上面的二次项中没有a^2和b^2
include_bias : bool, default=True
如果为True(默认值),则包含一个bias列,如果为True的话,那么就会有上面的 1那一项。
order : {‘C’, ‘F’}, default=’C’
密集情况下输出数组的顺序。“F”阶的计算速度更快,但可能会降低后续估计的速度。
- Attributes(属性)
powers_ : ndarray of shape (n_output_features, n_input_features)
powers_[i, j]是第i个输出中第j个输入的指数。
n_input_features_ : int
输入特征的总数
n_output_features_ : int
多项式输出特征的总数。输出特征的数量是通过迭代输入特征的所有适当大小的组合来计算的。
- Methods(方法)
fit(X[, y])
计算输出特征的数量
fit_transform(X[, y])
适应数据,然后转换它
get_feature_names([input_features])
返回输出特征的特征名
get_params([deep])
获取该估计器的参数
set_params(**params)
为该估计器设置参数
transform(X)
将数据转换为多项式特征
>>> import numpy as np
>>> from sklearn.preprocessing import PolynomialFeatures
>>> X = np.arange(6).reshape(3, 2)
>>> X
array([[0, 1],
[2, 3],
[4, 5]])
>>> poly = PolynomialFeatures(2)
>>> poly.fit_transform(X)
(1,a,b,a^2,ab,b^2)
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
>>> poly = PolynomialFeatures(interaction_only=True)
>>> poly.fit_transform(X)
(1,a,b,ab)
array([[ 1., 0., 1., 0.],
[ 1., 2., 3., 6.],
[ 1., 4., 5., 20.]])
# 波士顿房价预测
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
import warnings
from sklearn.datasets import load_boston
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.linear_model import ElasticNetCV
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.metrics import mean_squared_error, r2_score
# 设置随机数种子
np.random.seed(1)
# 获取数据
def loaddata():
data = load_boston()
X = np.array(data.data) # 特征值
y = np.array(data.target).reshape(-1, 1) # 目标值
return X, y
if __name__ == '__main__':
# 消除警告
warnings.filterwarnings(action='ignore')
# 设置精度
np.set_printoptions(suppress=True)
# 加载数据
X, y = loaddata()
# 数据集分割
# random_state为随机数种子,为0时,产生不同的随机数
X_train, X_test, y_train, y_test = train_test_split(X, y, train_size=0.7, random_state=0)
# 线性模型
model = Pipeline([
('ss', StandardScaler()),
('poly', PolynomialFeatures(degree=3, include_bias=True)),
('linear', ElasticNetCV(alphas=np.logspace(-3, 2, 10),
l1_ratio=(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1),
fit_intercept=False, cv=3))
])
# 拟合模型
model.fit(X_train, y_train)
# 获得模型的参数
linear = model.get_params('linear')['linear']
print('超参数 =', linear.alpha_)
print('l1_ratio_ = ', linear.l1_ratio_)
# 预测
order = y_test.argsort(axis=0)
y_test = y_test[order].reshape(len(y_test),-1)
X_test = X_test[order, :].reshape(len(y_test),-1)
y_ev_pred = model.predict(X_test)
# 评价
print('ElasticNet MSE=', mean_squared_error(y_test, y_ev_pred.reshape(-1,1)))
print('ElasticNet R2=', r2_score(y_test, y_ev_pred))
# 画图
mpl.rcParams['font.sans-serif'] = [u'simHei']
mpl.rcParams['axes.unicode_minus'] = False
t = np.arange(len(y_test)) # 样本编号
fig = plt.figure(facecolor='w')
fig.subplots()
plt.plot(t, y_test, 'r-', lw=2, label=u'真实值')
plt.plot(t, y_ev_pred, 'b-', lw=2, label=u'估计值')
plt.legend(loc='best')
plt.title('波士顿房价预测', fontsize=18)
plt.xlabel('样本编号', fontsize=15)
plt.ylabel('房屋价格', fontsize=15)
plt.grid()
plt.show()