做图神器的网站,Wordpress博客cdn,潍坊建设街邮政公司,做旅游网站都需要的调查特征缩放
因为对于大多数的机器学习算法和优化算法来说#xff0c;将特征值缩放到相同区间可以使得获取性能更好的模型。就梯度下降算法而言#xff0c;例如有两个不同的特征#xff0c;第一个特征的取值范围为1——10#xff0c;第二个特征的取值范围为1——10000。在梯度… 特征缩放
因为对于大多数的机器学习算法和优化算法来说将特征值缩放到相同区间可以使得获取性能更好的模型。就梯度下降算法而言例如有两个不同的特征第一个特征的取值范围为1——10第二个特征的取值范围为1——10000。在梯度下降算法中代价函数为最小平方误差函数所以在使用梯度下降算法的时候算法会明显的偏向于第二个特征因为它的取值范围更大。在比如k近邻算法它使用的是欧式距离也会导致其偏向于第二个特征。对于决策树和随机森林以及XGboost算法而言特征缩放对于它们没有什么影响。
常用的特征缩放算法有两种归一化(normalization)和标准化(standardization)。归一化算法是通过特征的最大最小值将特征缩放到[0,1]区间范围
归一化(Normalization)
归一化是利用特征的最大最小值为了方便数据处理将特征的值缩放到[0,1]区间对于每一列的特征使用min-max函数进行缩放可以使处理过程更加便捷、快速计算。
特征归一化的优势
提升收敛速度 对于线性model来说数据归一化后最优解的寻优过程明显会变得平缓更容易正确的收敛到最优解。
造成图像的等高线为类似椭圆形状最优解的寻优过程图像如下 两个特征区别相差特别大。所形成的等高线比较尖锐。当时用梯度下降法时很可能要垂直等高线走需要很多次迭代才能收敛。
而数据归一化之后损失函数的表达式可以表示为 其中变量的前面系数几乎一样则图像的等高线为类似圆形形状最优解的寻优过程图像如下 对两个原始特征进行了归一化处理其对应的等高线相对来说比较圆在梯度下降时可以较快的收敛。 提升模型精度如果我们选用的距离度量为欧式距离如果数据预先没有经过归一化那么那些绝对值大的features在欧式距离计算的时候起了决定性作用。 从经验上说归一化是让不同维度之间的特征在数值上有一定比较性可以大大提高分类器的准确性。
特征归一化方法MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
x[[10001,2],[16020,4],[12008,6],[13131,8]]
min_max_scaler MinMaxScaler()
X_train_minmax min_max_scaler.fit_transform(x)#归一化后的结果
X_train_minmax# 它默认将每种特征的值都归一化到[01]之间
MinMaxScaler的实现
X_std (X - X.min(axis0)) / (X.max(axis0) - X.min(axis0))
X_scaled X_std * (max - min) min
这是向量化的表达方式说明X是矩阵其中
X_std将X归一化到[01]之间X.min(axis0)表示列最小值maxmin表示MinMaxScaler的参数feature_range参数。即最终结果的大小范围 以下例说明计算过程max1min0 S11(10001-10001)/(16020-10001)0
S21(16020-10001)/(16020-10001)1
S31(12008-10001)/(16020-10001)0.333444
S41(13131-10001)/(16020-10001)0.52002
S12(2-2)/(8-2)0
S22(4-2)/(8-2)0.33
S32(6-2)/(8-2)0.6667
S42(8-2)/(8-2)1 数据的标准化
和0-1标准化不同Z-score标准化利用原始数据的均值mean和标准差standard deviation进行数据的标准化。同样是逐列进行操作每一条数据都减去当前列的均值再除以当前列的标准差在这种标准化操作下如果原数据服从正态分布处理之后的数据服从标准正态分布。Z-Score标准化计算公式如下 我们也可通过如下方式对张量进行Z-Score标准化处理。
from sklearn.preprocessing import StandardScaler
x[[10001,2],[16020,4],[12008,6],[13131,8]]
ss StandardScaler()
X_train ss.fit_transform(x)
X_trainarray([[-1.2817325 , -1.34164079],[ 1.48440157, -0.4472136 ],[-0.35938143, 0.4472136 ],[ 0.15671236, 1.34164079]]) 和0-1标准化不同Z-Score标准化并不会将数据放缩在0-1之间而是均匀地分布在0的两侧
特征编码
我们拿到的数据通常比较脏乱特征变量除了数值外可能还会包括带有各种非数字特殊符号等特征值比如中文。但一般的机器学习模型一般都是处理数值型的特征值因此需要将一些非数值的特殊特征值转为为数值因为只有数字类型才能进行计算。因此对于各种特殊的特征值我们都需要对其进行相应的编码也是量化的过程这就要用到特征编码。
编码方法
LabelEncoder 适合处理字符型数据或label类一般先用此方法将字符型数据转换为数值型然后再用以下两种方法编码get_dummies pandas 方法处理DataFrame 数据更便捷OneHotEncoder 更普遍的编码方法
LabelEncoder️
label-encoding就是用标签进行编码的意思即我们给特征变量自定义数字标签量化特征。
将离散的数值或字符串转化为连续的数值型数据。n个类别就用0到n-1个数表示。没有扩维多用于标签列的编码如果用于特征的编码那编码后还要用get_dummies或OneHotEncoder进行再编码才能实现扩维。
import pandas as pd
Class[大一,大二,大三,大四]
df pd.DataFrame({Class:Class})
classMap {大一:1,大二:2,大三:3,大四:4}
df[Class] df[Class].map(classMap)上面就将Class特征进行相应的编码。其实Label encoding并没有任何限制你也可以将Class定义为10,20,30,40只不过1,2,3,4看起来比较方便。因此总结概括Label encoding就是将原始特征值编码为自定义的数字标签完成量化编码过程。
get_dummies️
pandas编码工具直接将数据扩维
pandas.get_dummies(data, prefixNone, prefix_sep_, dummy_naFalse, columnsNone, sparseFalse, drop_firstFalse, dtypeNone)
import pandas as pd # 创建一个包含分类变量的 DataFrame
data {Color: [Red, Blue, Green, Red, Blue]}
df pd.DataFrame(data) print(原始 DataFrame:)
print(df) # 使用 get_dummies 进行独热编码
df_dummies pd.get_dummies(df) print(\n独热编码后的 DataFrame:)
print(df_dummies)原始 DataFrame: Color
0 Red
1 Blue
2 Green
3 Red
4 Blue 独热编码后的 DataFrame: Color_Blue Color_Green Color_Red
0 0 0 1
1 1 0 0
2 0 1 0
3 0 0 1
4 1 0 0同时在pandas可以指定 columns参数pd.get_dummies(df,columns[“length”,“size”])指定被编码的列,返回被编码的列和不被编码的列
df_4 pd.get_dummies(df,columns[length,size])
OneHotEncoder️
当然除了自然顺序编码外常见的对离散变量的编码方式还有独热编码独热编码的过程如下 不难发现独热编码过程其实和我们此前介绍的哑变量创建过程一致至少在sklearn中并无差别。对于独热编码的过程我们可以通过pd.get_dummies函数实现也可以通过sklearn中OneHotEncoder评估器转化器来实现。
import numpy as np
from sklearn.preprocessing import OneHotEncoder # 假设我们有一些分类数据
categories np.array([cat, dog, fish, cat, dog, bird]).reshape(-1, 1) # 创建 OneHotEncoder 实例
encoder OneHotEncoder(sparseFalse) # 使用数据拟合编码器并转换数据
onehot encoder.fit_transform(categories) # 输出独热编码的结果
print(onehot) # 输出编码器的类别
print(encoder.categories_)[[1. 0. 0.] [0. 1. 0.] [0. 0. 1.] [1. 0. 0.] [0. 1. 0.] [0. 0. 0.]]
[array([bird, cat, dog, fish], dtypeobject)]对于独热编码的使用有一点是额外需要注意的那就是对于二分类离散变量来说独热编码往往是没有实际作用的。例如对于上述极简数据集而言Gender的取值是能是M或者F独热编码转化后某行Gender_F取值为1、则Gender_M取值必然为0反之亦然。因此很多时候我们在进行独热编码转化的时候会考虑只对多分类离散变量进行转化而保留二分类离散变量的原始取值。此时就需要将OneHotEncoder中drop参数调整为’if_binary’以表示跳过二分类离散变量列
sklearn中逻辑回归的参数解释 C 惩罚系数penalty 正则化项 相比原始损失函数正则化后的损失函数有两处发生了变化其一是在原损失函数基础上乘以了系数C其二则是加入了正则化项。其中系数C也是超参数需要人工输入用于调整经验风险部分和结构风险部分的权重C越大经验风险部分权重越大反之结构风险部分权重越大。此外在L2正则化时采用的表达式其实相当于是各参数的平方和除以2在求最小值时本质上和w的2-范数起到的作用相同省去开平方是为了简化运算而除以2则是为了方便后续求导运算和2次方结果相消。
其实除了最小二乘法和梯度下降以外还有非常多的关于损失函数的求解方法而选择损失函数的参数就是solver参数。 逻辑回归可选的优化方法包括
liblinear这是一种坐标轴下降法并且该软件包中大多数算法都有C编写运行速度很快支持OVRL1或OVRL2lbfgs全称是L-BFGS牛顿法的一种改进算法一种拟牛顿法适用于小型数据集并且支持MVML2、OVRL2以及不带惩罚项的情况newton-cg同样也是一种拟牛顿法和lbfgs适用情况相同sag随机平均梯度下降随机梯度下降的改进版类似动量法会在下一轮随机梯度下降开始之前保留一些上一轮的梯度从而为整个迭代过程增加惯性除了不支持L1正则化的损失函数求解以外包括弹性网正则化其他所有损失函数的求解sagasag的改进版修改了梯度惯性的计算方法使得其支持所有情况下逻辑回归的损失函数求解
import pandas as pd
import numpy as np
import warnings
warnings.filterwarnings(ignore)
%matplotlib inlinedata pd.read_csv(creditcard2.csv)from sklearn.preprocessing import MinMaxScaler
data[normAmount] MinMaxScaler().fit_transform(data[Amount].values.reshape(-1, 1))
data data.drop([Time,Amount],axis1)X data.iloc[:, data.columns ! Class].values
y data.iloc[:, data.columns Class][Class].valuesX_train, X_test, y_train, y_test train_test_split(X,y,test_size 0.3, random_state 114)def kflod_scores(X,y):fold KFold(5,shuffleFalse)c_param_range [0.01, 0.1, 1]show_result pd.DataFrame()recalls []cv KFold(n_splits5, shuffleTrue, random_state114)for c_param in c_param_range:lr_model LogisticRegression(Cc_param, penaltyl2)print(-------------------------------------------)print(正则化惩罚力度: , c_param)print(-------------------------------------------)print()result cross_validate(lr_model, X, y, cvcv, scoringrecall, verboseTrue, n_jobs-1)print(result[test_score])recalls.append(np.mean(result[test_score]))show_result[c_param] list(c_param_range)show_result[recall] recallsreturn show_result
kflod_scores(X_train,y_train)
刚刚进行的建模存在一些问题: (1).过程不够严谨诸如测试集中测试结果不能指导建模、参数选取及搜索区间选取没有理论依据等问题仍然存在 (2).执行效率太低如果面对更多的参数这是更一般的情况手动执行过程效率太低无法进行超大规模的参数挑选 (3).结果不够精确一次建模结果本身可信度其实并不高我们很难证明上述挑选出来的参数就一定在未来数据预测中拥有较高准确率。
网格搜索 sklearn中最常用的搜索策略就是使用GridSearchCV进行全搜索即对参数空间内的所有参数进行搜索. from sklearn.model_selection import GridSearchCV GridSearchCV它的参数主要如下 from sklearn.datasets import load_iris
X, y load_iris(return_X_yTrue)
X_train, X_test, y_train, y_test train_test_split(X, y, random_state114)param_grid_simple {penalty: [l1, l2],C: [1, 0.5, 0.1, 0.05, 0.01]}search GridSearchCV(estimatorlgr,param_gridparam_grid_simple)search.fit(X_train, y_train)search.best_estimator_
# 训练完成后的最佳评估器search.best_estimator_.coef_
# 逻辑回归评估器的所有属性search.best_score_
# 0.9727272727272727 在默认情况下未修改网格搜索评估器中评估指标参数时此处的score就是准确率。此处有两点需要注意
其一该指标和训练集上整体准确率不同该指标是交叉验证时验证集准确率的平均值而不是所有数据的准确率其二该指标是网格搜索在进行参数挑选时的参照依据。