PCA可以用于可视化、降噪、加速训练、
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler() #标准化缩放
from sklearn.decomposition import PCA
X_scaled=scaler.fit_transform(X) #获得缩放的结果
pca=PCA(n_components=2) #降到2维
X_pca=pca.fit_transform(X_scaled) #PCA前必须缩放
#查看解释方差比
print("Explained Variance ratio:",pca.explained_variance_ratio_)
注意:PCA降低维度后的特征值和原来的特征值完全不同,降维后的行数和原来的行数相同。
用于捕捉特征间的交互作用,变化后的特征值里包含原有的特征值
from sklearn.datasets import load_iris
iris =load_iris() #加载鸢尾花数据
X=iris.data #特征值:一共四列,分别是花萼长度、宽度、花瓣长度、宽度
y=iris.target #预测值:0,1,2分别代表山鸢尾、变色鸢尾、维吉尼亚鸢尾
print(X.shape,y.shape) #可以看到X是150行,4列, y是150行
from sklearn.preprocessing import PolynomialFeatures #导入模块
poly = PolynomialFeatures(degree=2,include_bias=False) #指定深度是2.,include_bias=False,是避免重复常数项
X_poly = poly.fit_transform(X) #训练并转换
print(X_poly.shape) #转换之后的维度
X_poly_Dataframe=pd.DataFrame(X_poly,columns=poly.get_feature_names_out(input_features=iris.feature_names))
X_dataframe=pd.DataFrame(X,columns=iris.feature_names)
print(X_dataframe.columns,"\n",X_poly_Dataframe.columns) #输出变化前后的特征值的对比
特征数量的变化规律是:n个特征,深度为d,输出的特征值数量为C(n+d,d)-1个.因为指定了include_bias=False,所以是减去了一个常数项。 上面这个例子:本来是4个维度,指定深度是2,变化后为((4+2)!)/(2!)-1=(65)/(21)-1=14.所以就变为14个特征值。
from sklearn.base import BaseEstimator,TransformerMixin
class CustomLogTransformer(BaseEstimator,TransformerMixin):
def __init__(self,add_constant=1):
self.add_constant = add_constant
def fit(self,X,y=None):
return self
def transform(self,X):
return np.log(X+self.add_constant)
#使用自定义的类进行转换
log_trans = CustomLogTransformer(add_constant=1)
X_log = log_trans.transform(X_positive)
这里是自定义一个转换的类CustomLogTransformer,实现了输入一个数,对矩阵进行加上这个值之后取对数,这在标准化中是常用的操作。