Traditional_machine_learning_tutorial

2.特征选择

2.1 特征缩放 (只有连续变量能进行缩放)

StandardScaler(标准化:均值为0,方差为1)

from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
X_scaled = scaler.fit_transform(X)

MinMaxScaler归一化到[0,1]

from sklearn.preprocessing import MinMaxScaler
minmax=MinMaxScaler() #加载归一化函数,把数值归一化到[0,1]
X_minmax = minmax.fit_transform(X)
print(X_minmax)

如果存在极端值,极大值或极小值会对归一化产生影响。所以此时可以先进行标准化。

RobustScaler对异常值鲁棒

from sklearn.preprocessing import RobustScaler
robust=RobustScaler() #加载对异常值鲁棒
X_robust=robust.fit_transform(X)

先划分训练集、测试集,再在训练集上fit,测试集上transform。

2.2 编码分类变量

LabelEncoder(用于有序分类)

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这种整数。

OneHotEncoder(推荐用于无序分类)

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,这样输出的就是稀疏矩阵,可以节省大量空间。

使用pd.get_dummies(pandas的方案)

df_encoded = pd.get_dummies(df,columns=['color','size'])
df_encoded

把指定列转为逻辑值True或False,新增的列名是size_S,size_M这种格式,类似于OnehotEncoder

字典向量化器 DictVectorizer

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()

2.3 特征选择方法

基于方差(移除低方差特征)

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个特征值。

单变量统计SelectKBest

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的参数值

递归特征消除 RFE

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)

即可输出特征的重要性,然后可以自由选择哪些最重要的特征进行训练