一、数据清洗1.1重复值:重复值会导致数据方差变小,影响数据分布,重复值主要分为两种:1.1.1 记录重复:一个或多个特征列的几条记录完全一致对于记录重复数据,一般采用直接删除方式: DataFrame.drop_duplicates(subset=None,Keep='first',inplace=Flase) #去掉完全相同的行 subset: 用来指定特定的列,默认所有列 1.1.2 特征重复:一个或多个特征名不同,但是数据完全一样pandas提供了一个corr函数可以进行相似度的检测,当相似度为1,表示两列数据一模一样。 DataFrame.corr(method='pearson',min_periods=1) 1.2缺省值:缺省值会导致数据量变小,增加分析难度,影响准确性# dataframe查看某列缺省值和非缺省值的数量 data['temp'].isnull().sum() data['temp'].notnull().sum() 1.2.1 删除法:当缺省的个数非常少时可以采用直接删除的方式1.2.2 替换法:对于连续变化的量的缺省情况,可以考虑使用前一个非None值或者后一个非None值或者某个固定的value进行替换1.2.3插值法:pandas提供了interpolate方法进行插值操作,但是scipy提供的interpolate模块功能更加全面##线性插值 import numpy as np from scipy.interpolate import interp1d x=np.array([1,2,3,4,5,8,9,10]) y=np.array([2,8,18,32,50,128,162,200]) linearinsert=interp1d(x,y,kind='linear') x2=[6,7] #需要插值的x2值不能超过x的范围 y2=linearinsert(x2) print(y2) [ 76. 102.] 1.3异常值:数据处理中,异常值是指偏离明显的数值,有时候也成为离群点,异常值在进行数据分析的时候,分析结果容易产生偏差甚至错误,对于异常值,一般采用删除的方法。3δ原则和箱型图用于做初步的数据探查,如果经过检验数据服从正态分布,就使用3δ原则,否则使用箱型图。1.3.1 3δ原则如果数据服从正态分布,在3σ原则下,异常值被定义为⼀组测定值中与平均值的偏差超过三倍标准差的值。在正态分布下,距离平均值3σ之外的值出现的概率为 P(|x-µ|>3σ)<=0.003,属于极个别的⼩概率事件。如果数据不服从正态分布,也可以⽤远离平均值的多少倍标准差来描述 这个原则有个前提条件:数据需要服从正态分布。 # 正态分布的检验方法:KS检验 # 基于累计分布函数的,用于检验一个分布是否符合某种理论分布或比较两个经验分布是否有显著差异。 # kstest方法:参数分别是:待检验的数据,检验方法(这里设置成norm正态分布),均值与标准差 # 结果返回两个值:statistic → D值,pvalue → P值 # H0:样本符合 # H1:样本不符合 # 如果p>0.05接受H0,为正态分布 ,反之 #导入scipy模块 from scipy import stats import pandas as pd data = pd.read_excel(r'sale.xls', index_col = False) #读取数据 u = data[u'销量'].mean() # 计算均值 std = data[u'销量'].std() # 计算标准差 stats.kstest(data[u'销量'], 'norm', (u, std)) # 结果展示KstestResult(statistic=0.16962184456795837, pvalue=1.5900252683896546e-05) # 原文链接:https://blog.csdn.net/weixin_45063703/article/details/122379055 # 3δ原则异常值判断方法 import numpy as np import pandas as pd defdetect_outliers(data,threshold=3): mean_d = np.mean(data) std_d = np.std(data) outliers =[] for y in data_d: z_score=(y - mean_d)/std_d if np.abs(z_score)> threshold: outliers.append(y) return outliers 1.3.2 箱型图四分位间距 (IQR) 的概念被⽤于构建箱形图。IQR 是统计学中的⼀个概念,通过将数据集分成四分位来衡量统计分散度和数据可变性。简单来说,任何数据集或任意⼀组观测值都可以根据数据的值以及它们与整个数据集的⽐较情况被划分为四个确定的间隔。四分位数会将数 据分为三个点和四个区间。四分位间距对定义离群点⾮常重要。它是第三个四分位数和第⼀个四分位数的差 (IQR = Q3 -Q1)。在这种情况下,离群点被定义为低于箱 形图下触须(或 Q1 − 1.5x IQR)或⾼于箱形图上触须(或 Q3 + 1.5x IQR)的观测值。 #箱型图异常值识别方法 defdetect_outliers(sr): q1 = sr.quantile(0.25) q3 = sr.quantile(0.75) iqr = q3-q1 #Interquartile range fence_low = q1-1.5*iqr fence_high = q3+1.5*iqr outliers = sr.loc[(sr < fence_low)|(sr > fence_high)] return outliers # 链接:https://wenku.baidu.com/view/66158847986648d7c1c708a1284ac850ad0204b8.html 二、数据标准化数据标准化是机器学习、数据挖掘中常用的一种方法,是最基本的一个步骤。 数据标准化主要是应对特征向量中数据很分散的情况,防止小数据被大数据(绝对值)吞并的情况。 另外,数据标准化也有加速训练,防止梯度爆炸的作用。 为什么要标准化/归一化? 提升模型精度:标准化/归一化后,不同维度之间的特征在数值上有一定比较性,可以大大提高分类器的准确性。 加速模型收敛:标准化/归一化后,最优解的寻优过程明显会变得平缓,更容易正确的收敛到最优解。 如下图所示:左图表示未经过数据标准化处理的loss更新函数,右图表示经过数据标准化后的loss更新图。可见经过标准化后的数据更容易迭代到最优点,而且收敛更快。 哪些机器学习算法需要标准化和归一化: 1)需要使用梯度下降和计算距离的模型要做归一化,因为不做归一化会使收敛的路径程z字型下降,导致收敛路径太慢,而且不容易找到最优解,归一化之后加快了梯度下降求最优解的速度,并有可能提高精度。比如说线性回归、逻辑回归、adaboost、xgboost、GBDT、SVM、NeuralNetwork等。需要计算距离的模型需要做归一化,比如说KNN、KMeans等。 2)概率模型、树形结构模型不需要归一化,因为它们不关心变量的值,而是关心变量的分布和变量之间的条件概率,如决策树、随机森林。 归一化比标准化方法产生的标准差小,使用归一化来缩放数据,则数据将更集中在均值附近。这是由于归一化的缩放是“拍扁”统一到区间(仅由极值决定),而标准化的缩放是更加“弹性”和“动态”的,和整体样本的分布有很大的关系。所以归一化不能很好地处理离群值,而标准化对异常值的鲁棒性强,在许多情况下,它优于归一化。--如果要使用归一化,需要先将异常值排除,如果使用标准化则需要检验数据是否符合正态分布。2.1 [0, 1] 标准化[0, 1] 标准化是最基本的一种数据标准化方法,指的是将数据压缩到0~1之间。 标准化公式如下 #代码如下 def MaxMinNormalization(x): '''[0,1] normaliaztion''' x = (x - np.min(x)) / (np.max(x) - np.min(x)) return x #或者使用现成库 from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() scaler.fit(df) scaled_features = scaler.transform(df) df_MinMax = pd.DataFrame(data=scaled_features, columns=['Age', 'Salary','Purchased','Country_France','Country_Germany', 'Country_spain']) 原始数据和转换后数据对比 2.2 Z-score标准化Z-score标准化是基于数据均值和方差的标准化化方法。标准化后的数据是均值为0,方差为1的正态分布。这种方法要求原始数据的分布可以近似为高斯分布,否则效果会很差。如果不服从高斯分布,可以考虑将原始数据取log或者开根号,再检验是否符合高斯分布。 标准化公式如下 #代码实现 def ZscoreNormalization(x): '''Z-score normaliaztion''' x = (x - np.mean(x)) / np.std(x) return x #或者使用现成库 from sklearn.preprocessing import StandardScaler sc_X = StandardScaler() sc_X = sc_X.fit_transform(df) sc_X = pd.DataFrame(data=sc_X, columns=['Age', 'Salary','Purchased','Country_France','Country_Germany', 'Country_spain']) 三、数据转换3.1哑变量处理某些数据不是数值型的数据,如性别等,在进行计算的时候,往往需要数值型的数据,此时,需要将这些数据进行数值型的转换。哑变量也称虚拟变量,当自变量x为多分类时,会将每一类用一个变哑变量表示。例如x1表示坐飞机,x2表示做火车,x3表示自驾等,当x1=1表示坐飞机,x1=0表示不坐飞机。 在此需要注意的是3值以上的离散变量需要进行哑变量处理,并且增加截距项intercept,同时进行训练集和测试集的拆分。(目的是防止模型过拟合) #Pandas提供函数get_dummies获取并将非数值型的数据(哑数据)并转换成数值型数据。pandas.get_dummies(data, prefix=None, prefix_sep='_', dummy_na=False, columns=None, sparse=False, drop_first=False)[source] 参数详解 data : array-like, Series, or DataFrame 输入的数据 prefix : string, get_dummies转换后,列名的前缀,默认为None columns : 指定需要实现类别转换的列名 否则转换所有类别性的列 dummy_na : bool, default False 增加一列表示空缺值,如果False就忽略空缺值 drop_first : bool, default False 获得k中的k-1个类别值,去除第一个,防止出现多重共线性 原文链接:https://blog.csdn.net/qq_43404784/article/details/89486442 若针对训练数据已经做好了独热编码并建立了模型,而新增的预测数据或分类数据的类别变量未包含完整的类别。此时直接使用pd.get_dummies,会发现与训练集得到的结果不一样。例如:训练数据中季节列中春、夏、秋、冬都出现过,而在新的测试数据中只出现了春与夏,两者的结果会不一样。可以在预测数据中新增以下代码,详见原文。 data['季节'] = data['季节'].astype( 'category', categories=['春', '夏', '秋', '冬'] ) 3.2 对循环特征比如24小时的编码,用cos和sin进行编码hour_x = cos(2pihour/24) and hour_y = sin(2pihour/24) 原文链接:https://blog.csdn.net/qq_34107425/article/details/103939891 四、误差评估参考链接:https://blog.csdn.net/weixin_44333889/article/details/122057943 对于回归评价: MAE 会忽略异常值,而 RMSE 会注意到异常值并得到没有偏差的预测。那么应该使用哪个指标呢?很遗憾,不存在确定的答案。如果你是一名供应链领域的数据科学家,你应该多做试验:如果使用 MAE 作为性能评估指标会得到很大偏差,你可能需要使用 RMSE。如果数据集包含很多异常值,导致预测结果产生偏移,你可能需要用 MAE。 还需要注意的是,你可以选择一个或多个评估指标(如 MAE&bias)来计算预测的误差,然后用另一个指标(RMSE?)来对模型进行优化。 还有最后一个技巧,面对实际值较低的序列,可以将其聚合到一个更大的时间范围。例如,如果以星期为周期的值很低,你可以试试按照月份来进行预测,甚至按季度预测。你也可以通过简单的除法,把原始时间序列分解到较小的时间范围上。这一方法可以帮助你更好地使用 MAE 作为评估指标,同时对峰值做平滑处理。 对于分类则集中使用AUC 4.1回归评价-均方误差(MSE)均方误差(Mean Square Error,MSE),反映估计量与被估计量之间差异程度的一种度量。设t是根据子样确定的总体参数θ的一个估计量,(θ-t)2的数学期望,称为估计量t的均方误差。它等于σ2+b2,其中σ2与b分别是t的方差与偏倚。 4.2回归评价-均方根误差(RMSE)均方根误差(Root Mean Square Error,RMSE),从名称来看,我们都能猜得到是什么意思。多了一个根,这个“根”的意思顾名思义,就只是加了个根号。均方根误差是预测值与真实值偏差的平方与观测次数n比值的平方根,在实际测量中,观测次数n总是有限的,真值只能用最可信赖(最佳)值来代替。 4.3回归评价-平均绝对误差(MAE)平均绝对误差(Mean Absolute Error,MAE),绝对偏差平均值即平均偏差,指各次测量值的绝对偏差绝对值的平均值。平均绝对误差可以避免误差相互抵消的问题,因而可以准确反映实际预测误差的大小。 4.4回归评价-平均绝对百分比误差(MAPE)平均绝对百分比误差(Mean Absolute Percentage Error,MAPE),平均绝对百分比误差之所以可以描述准确度是因为平均绝对百分比误差本身常用于衡量预测准确性的统计指标,如时间序列的预测。 4.5回归评价-对称平均绝对百分比误差(SMAPE)对称平均绝对百分比误差(Symmetric Mean Absolute Percentage Error,SMAPE) import pandas as pd import numpy as np from sklearn.metrics import mean_squared_error,mean_absolute_error, mean_absolute_error def check_error(orig, pred, name_col='', index_name=''): ''' orig:实际值 pred:预测值 ''' bias = np.mean(orig - pred) mse = mean_squared_error(orig, pred) rmse = sqrt(mean_squared_error(orig, pred)) mae = mean_absolute_error(orig, pred) mape = np.mean(np.abs((orig - pred) / orig)) * 100 res_smape = 2.0 * np.mean(np.abs(pred - orig) / (np.abs(pred) + np.abs(orig))) * 100 error_group = [bias, mse, rmse, mae, mape,res_smape] serie = pd.DataFrame(error_group, index=['BIAS','MSE','RMSE','MAE', 'MAPE','SMAPE'], columns=[name_col]) serie.index.name = index_name return serie 4.6 AUC -二分类和多分类模型,采用AUC作为评价指标from sklearn.metrics import roc_auc_score roc_auc_score(y_true, y_score, *, average='macro', sample_weight=None, max_fpr=None, multi_class='raise', labels=None) 计算曲线ROC的面积
#二分类 from sklearn.datasets import load_breast_cancer from sklearn.linear_model import LogisticRegression from sklearn.metrics import roc_auc_score X, y = load_breast_cancer(return_X_y=True) clf = LogisticRegression(solver='liblinear', random_state=0).fit(X, y) from sklearn.metrics import roc_auc_score #方式一 roc_auc_score(y, clf.predict_proba(X)[:, 1]) #方式二 roc_auc_score(y, clf.decision_function(X)) #多分类 from sklearn.datasets import load_iris X, y = load_iris(return_X_y=True) clf = LogisticRegression(solver='liblinear').fit(X, y) clf.predict_proba(X) from sklearn.metrics import roc_auc_score #multi_class='ovr' roc_auc_score(y, clf.predict_proba(X), multi_class='ovr') 原文链接:https://blog.csdn.net/Alex_81D/article/details/115733060
|
|
来自: NeighborMrSun > 《机器学习模型》