from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_scaled = scaler.fit_transform(X)
from sklearn.preprocessing import MinMaxScaler
minmax=MinMaxScaler() #加载归一化函数,把数值归一化到[0,1]
X_minmax = minmax.fit_transform(X)
print(X_minmax)
如果存在极端值,极大值或极小值会对归一化产生影响。所以此时可以先进行标准化。
from sklearn.preprocessing import RobustScaler
robust=RobustScaler() #加载对异常值鲁棒
X_robust=robust.fit_transform(X)
先划分训练集、测试集,再在训练集上fit,测试集上transform。
df['size']=['S','S','M','L']
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
df['size_encoded'] = le.fit_transform(df['size']) #转为0,1,2,
print(df)
上面是把有序的分类字符串转为了0,1,2这种整数。
df['color']=['red','blue','green','pink']
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder(sparse_output=False) #这里的sparse_output=False很关键
encoded = encoder.fit_transform(df[['color']])
encoded_df = pd.DataFrame(encoded,columns=encoder.get_feature_names_out())
print(encoded_df)
上面的示例是把color列转变为0和1的矩阵,对于类别比较少时可以这样转换。相当于是每个类别增加了1列特征值。
如果类别比较多,可以指定sparse_output=True,这样输出的就是稀疏矩阵,可以节省大量空间。
df_encoded = pd.get_dummies(df,columns=['color','size'])
df_encoded
把指定列转为逻辑值True或False,新增的列名是size_S,size_M这种格式,类似于OnehotEncoder
from sklearn.feature_extraction import DictVectorizer
data1= [{'age':35,'city':'chengdu','salary':15000},
{'age':21,'city':'chongqing','salary':4000},
{'age':55,'city':'jianning','salary':5000},
{'age':28,'city':'chengdu','salary':10000}]
dict_vectorizer = DictVectorizer(sparse=False) #这里设置sparse为False,输出密集矩阵。因为默认输出的稀疏矩阵不方便输出阅读。
X_dict = dict_vectorizer.fit_transform(data1)
data2 = pd.DataFrame(data1)
X_dataframe = pd.DataFrame(X_dict,columns=dict_vectorizer.get_feature_names_out())
print(data2,'\n',X_dataframe)
这是把字典的所有列转为数值型,如果原来的是数值型则不变,不是数值型则转为0和1的矩阵。
注意这个函数只能操作字典类型。
稀疏矩阵使用.toarray()可以转为数组。实际分析时,直接使用稀疏矩阵即可以,因为稀疏矩阵可以极大的减小消耗的内存资源。
from sklearn.feature_extraction.text.CountVectorizer import CountVectorizer
corpus = [
'This is the first document.',
'This document is the second document.',
'And this is the third one.',
'Is this the first document?',
]
count_vectorizer = CountVectorizer()
X = count_vectorizer.fit_transform(corpus)
count_vectorizer.get_feature_names_out()
from sklearn.datasets import load_iris
from sklearn.feature_selection import VarianceThreshold
selector = VarianceThreshold(threshold=0.3)
X,y = load_iris(return_X_y=True)
X_selected = selector.fit_transform(X)
print(X.shape,X_selected.shape)
这里是加载鸢尾花的数据,使用的是移除低方差,这里指定的阈值是0.3,即方差低于0.3的特征值将被过滤后丢弃。
通过查看原始的X的维度和X_selected的维度,可以看到过滤后,少了1列,即少了1个特征值。
from sklearn.feature_selection import SelectKBest,f_classif
selector = SelectKBest(score_func=f_classif,k=2) #选择前2个
X_new=selector.fit_transform(X,y)
print(X.shape,X_new.shape)
print(selector.score_) #输出特征值的评分
score_func的参数值
f_classif 适用于分类f_regression 适用于回归
这里是指定只要前2个特征值。这在实际建模分析时非常有用。from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
estimator = LogisticRegression()
rfe = RFE(estimator,n_features_to_select=3) #选择前3个
X_rfe = rfe.fit_transform(X,y)
print(X.shape,X_rfe.shape)
from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier()
rf.fit(X,y)
importances=rf.feature_importances_
print(importances)
即可输出特征的重要性,然后可以自由选择哪些最重要的特征进行训练