标签是我们要预测的事物,即简单线性回归中的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)