首页 > 技术文章 > 机器学习实战

sqy1998 2021-10-15 09:45 原文

标签是我们要预测的事物,即简单线性回归中的y变量,标签可以是小麦未来的价格、图片中显示的动物品种、音频剪辑的含义或任何事物。

特征是输入变量,即简单线性回归中的x变量。简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征。

样本是指数据的特定实例:x。(我们采用粗体 x 表示它是一个矢量。)我们将样本分为以下两类

  • 有标签样本
  • 无标签样本
  •  有标签样本同时包含特征和标签
  •                      

 

模型定义了特征与标签之间的关系

训练是指创建或学习模型。也就是说,向模型展示有标签样本,让模型逐渐学习特征与标签之间的关系。

推断是指将训练后的模型应用于无标签样本。也就是说,使用经过训练的模型做出有用的预测 (y')。

回归模型可预测连续值,分类模型可预测离散值

random_state 相当于随机数种子random.seed() 。random_state 与 random seed 作用是相同的。

 

例如:在sklearn可以随机分割训练集和测试集(交叉验证),只需要在代码中引入model_selection.train_test_split就可以了:

from sklearn import model_selection

x_train, x_test, y_train,y_test=model_selection.train_test_split(x,y,test_size=0.2,random_state=0)

 这里的random_state就是为了保证程序每次运行都分割一样的训练集和测试集。否则,同样的算法模型在不同的训练集和测试集上的效果不一样。

--------range 与 arange的区别---------

*range()返回的是range object,而 np.arange()返回的是numpy.ndarray()

*range只用于迭代,而np.arange作用远不止如此,它是一个序列,可被当作向量使用

*range()不支持步长为小数, np.arange()支持步长为小数

 

>>>range(1, 5, 2)
>>>for i in range(1, 5, 2):
...    print(i)
1
3
 
>>for i in np.arange(1, 5):
...    print(i)
1
2
3
4

 

-------array 和 mat的区别-------

array包含mat,mat只能是二维的而array可以是1D,2D,3D...

mat a*b矩阵乘积  a.*b是对应元素相乘

array a*b是对应元素相乘 np.dot(a,b)是矩阵相乘

------'module' object is not callable------

一般是变量名和模块名重复了,导入模块时,改为from time import time

------查看一块代码运行时间-------

代码块前加上t0=time()  代码后加上 time()-t0

 

-----ndim、shape、dtype函数的区别--------

ndim函数:返回一个数字,确定数组的维度

 

 

shape函数:返回一个元组,确定各个维度的元素个数

 

 

dtype函数:确定数组的数据类型

zip的用法:

zip函数接受任意多个(包括0个和1个)序列作为参数,返回一个tuple列表。

直接看示例:

1.示例1:

代码如下:

x = [1, 2, 3]

y = [4, 5, 6]

z = [7, 8, 9]

xyz = zip(x, y, z)

print xyz

运行的结果是:

[(1, 4, 7), (2, 5, 8), (3, 6, 9)]

从这个结果可以看出zip函数的基本运作方式。

2.示例2:

代码如下:

x = [1, 2, 3]

y = [4, 5, 6, 7]

xy = zip(x, y)

print xy

运行的结果是:

代码如下:

[(1, 4), (2, 5), (3, 6)]

从这个结果可以看出zip函数的长度处理方式。

3.示例3:

代码如下:

x = [1, 2, 3]

x = zip(x)

print x

运行的结果是:

代码如下:

[(1,), (2,), (3,)]

从这个结果可以看出zip函数在只有一个参数时运作的方式。

4.示例4:

代码如下:

x = zip()

print x

运行的结果是:

代码如下:

[]

从这个结果可以看出zip函数在没有参数时运作的方式

Python strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
Python rstrip() 删除 string 字符串末尾的指定字符(默认为空格).

print()默认换行输出,加上参数end=""不换行

break 和continue的区别:

break语句跳出了最内层的for循环,但还可以执行外层循环

continue:结束当前当次循环,即跳出循环体中还没有执行的语句,但是并不跳出当前循环

一个python的文件有两种使用的方法,第一是直接作为脚本执行,第二是import到其他的python脚本中被调用(模块重用)执行。因此if __name__ == 'main': 的作用就是分割直接执行和被调用的部分,在if __name__ == 'main': 下的代码只有在文件作为脚本直接执行才会被执行,而import到其他脚本中是不会被执行的

#python中报错了那么就把报错的地方给注释掉,再去运行看看

python 中return可以不用返回值 

用 import调用本地脚本时,注意不要用与现有模块重合的名字

 

 

real machine learning :

1.auc roc

AUC(area under the curve)是ROC曲线下的面积,所以,在理解AUC之前,要先了解ROC是什么。而ROC的计算又需要借助混淆矩阵

 

混淆矩阵

 

 个人理解:正例反例是二分类中相对概念,是根据预测结果定义的一个为正一个为反。而真假则是根据标签判定预测结果的正确与否,标签一致的为真,不一致的为假

 

 

 

 正例和反例数量不同时,auc评价不受影响,而召回率受影响很大。

 

训练集、测试集、验证集

第三种方式:把数据集随机分为训练集,验证集和测试集,然后用训练集训练模型,用验证集验证模型,根据情况不断调整模型,选择出其中最好的模型,再用训练集和验证集数据训练出一个最终的模型,最后用测试集评估最终的模型

这其实已经是模型评估和模型选择的整套流程了。在第二种方式中,我们已经把数据集分为了训练集和测试集,现在我们需要再分出一个测试集,用于最终模型的评估。因为已经有一个测试集了,因此我们把其中一个用于模型选择的测试集改名叫验证集,以防止混淆。(有些资料上是先把数据集分为训练集和测试集,然后再把训练集分为训练集和验证集)

 

前几个步骤和第二种方式类似:首先用训练集训练出模型,然后用验证集验证模型(注意:这是一个中间过程,此时最好的模型还未选定),根据情况不断调整模型,选出其中最好的模型(验证误差用于指导我们选择哪个模型),记录最好的模型的各项设置,然后据此再用(训练集+验证集)数据训练出一个新模型,作为最终的模型,最后用测试集评估最终的模型。

 

由于验证集数据的信息会被带入到模型中去,因此,验证误差通常比测试误差要小。同时需要记住的是:测试误差是我们得到的最终结果,即便我们对测试得分不满意,也不应该再返回重新调整模型,因为这样会把测试集的信息带入到模型中去。

sklearn 模型保存:

1 from sklearn.externals import joblib
2 joblib.dump(clf, "train_model.m") #存储
3 clf = joblib.load("train_model.m") #调用

 

机器学习常用评价指标

 

 Python 数据预处理 归一化、标准化、正则化

1.归一化:属性缩放到一个指定的最大和最小值之间,这能够经过preprocessing.MinMaxScaler类实现

经常使用的最小最大规范化方法是(x-min(x)/(max(x)-min(x)))

这种方法的目的包括:1.对于方差很小的属性能够加强其稳定性2.维持稀疏矩阵中为0的条目

 1 '''归一化和反归一化彻底用实例搞懂'''
 2 from sklearn import preprocessing
 3 import numpy as np
 4 X = np.array([[ 1., -1.,  2.],[ 2.,  0.,  0.],[ 0.,  1., -1.]])
 5 y=np.array([[1,-1,1],[4,3,6],[9,8,6]])
 6 z=np.array([[7,-7,7],[8,3,5],[3,6,9]])
 7 scaler1= preprocessing.MinMaxScaler(feature_range=(-1, 1)).fit(X)
 8 X_scaled = scaler1.transform(X)
 9 scaler2= preprocessing.MinMaxScaler(feature_range=(-1, 1)).fit(y)
10 y_scaled = scaler2.transform(y)
11 scaler3= preprocessing.MinMaxScaler(feature_range=(-1, 1)).fit(z)
12 z_scaled = scaler3.transform(z)
13 print(X)
14 print(y)
15 print(z)
16 print(X_scaled)
17 print(y_scaled)
18 print(z_scaled)
19 X1=scaler1.inverse_transform(X_scaled)
20 y1=scaler2.inverse_transform(y_scaled)
21 z1=scaler3.inverse_transform(z_scaled)
22 print(X1)
23 print(y1)
24 print(z1)
25 #print(X1[0, -1])
 1 from sklearn.preprocessing import MinMaxScaler
 2 scaler1 = MinMaxScaler(feature_range=(-1, 1))
 3 scaler2 = MinMaxScaler(feature_range=(-1, 1))
 4 scaler3 = MinMaxScaler(feature_range=(-1, 1))
 5 scaler4 = MinMaxScaler(feature_range=(-1, 1))
 6 price2['capacity_B5'] = scaler1.fit_transform(price2['capacity_B5'].values.reshape(-1,1))
 7 price2['deadtime'] = scaler2.fit_transform(price2['deadtime'].values.reshape(-1,1))
 8 price2['V'] = scaler3.fit_transform(price2['V'].values.reshape(-1,1))
 9 # price1['I_mean'] = scaler.fit_transform(price1['I_mean'].values.reshape(-1,1))
10 # price1['U_mean'] = scaler.fit_transform(price1['U_mean'].values.reshape(-1,1))
11 price2['feature_1'] = scaler4.fit_transform(price2['feature_1'].values.reshape(-1,1))
12 price2

归一化和反归一化时,scaler是不同的,需要设置不同的 scaler,进行反归一化时也需要调用对应的scaler1,scaler2,scaler3,scaler4

归一化和反归一化,scaler是对特征数据的每一列都进行归一化,进行反归一化时,inverse_transform(x_scaled)输出原来的数据特征

 

1 columns=['Cycle_num','I_mean','T_mean','deadtime','U_mean','capacity_B5','V','C_B5','feature_1']
2 from sklearn.preprocessing import MinMaxScaler
3 scaler=MinMaxScaler(feature_range=(-1, 1))
4 data1=scaler.fit_transform(data)
5 data2=pd.DataFrame(data1,columns=columns)
6 data2

 

在机器学习实战中,数据集和标签要分开做归一化,因为inverse_transform()会得到维度不同的结果,比如数据集特征是8维我要反归一化标签数据的 y_pred,y_true时,标签数据都是一维的就会报错

 

2.标准化:使用z-score方法规范化(x-mean(x)/std(x)),使用sklearn.preprocessing.scale()函s数,能够直接将给定数据进行标准化,均值为0,方差为1

 1 >>> from sklearn import preprocessing
 2 >>> import numpy as np
 3 >>> X = np.array([[ 1., -1.,  2.],
 4 ...               [ 2.,  0.,  0.],
 5 ...               [ 0.,  1., -1.]])
 6 >>> X_scaled = preprocessing.scale(X)
 7  
 8 >>> X_scaled                                          
 9 array([[ 0.  ..., -1.22...,  1.33...],
10        [ 1.22...,  0.  ..., -0.26...],
11        [-1.22...,  1.22..., -1.06...]])
12  
13 >>>#处理后数据的均值和方差
14 >>> X_scaled.mean(axis=0)
15 array([ 0.,  0.,  0.])
16  
17 >>> X_scaled.std(axis=0)
18 array([ 1.,  1.,  1.])

3.正则化

正则化的过程是将每一个样本缩放到单位范数(每一个样本的范数为1)。Normalization主要思想是对每一个样本计算其P-范数,而后对该样本中的每一个元素除以该范数,这样处理的结果是使得每一个处理后样本的p-范数(|1-norm,|2-norm)等于1

 机器学习中R2为什么可以为负?

为负说明模型解释信息的能力甚至还比不上标签自带的信息量,即估计的点还不如全用标签的均值代替预测的准

 *机器学习在计算MAE、R2、AE等指标时,由于MAE和R2都是有减运算,所以如果对标签和得到的预测值不做.reshape(-1,1),那么相减时原来比如是(52,)的列向量减去一个(,52)的行向量,最后会得到一个(52,52)的二维向量

# mape
test_mape=np.mean(np.abs((test_pred1-test_label1)/test_label1))
# rmse
test_rmse=np.sqrt(np.mean(np.square(test_pred1-test_label1)))
# mae
test_mae=np.mean(np.abs(test_pred1-test_label1))
# R2
test_r2=r2_score(test_label1,test_pred1)

 

 

 

 

 

推荐阅读