统计学习方法总结
第一章数据挖掘方法概述
业务理解
数据理解
数据准备
模型评估
模型评估
模型发布
第二章 数据理解和数据准备
数据理解
一:抽样偏差
获取的数据只能代表一部分的,与总体有偏差
二:数据粒度
三:数据的精确含义
四:变量类型:
名义变量,定序变量,定距变量,定比变量
五:冗杂变量
重复信息,多重共线性
六:完整性
取值范围,取值的一致性,异常值,整体的完整性
七:缺省值
八:数据链接
数据准备
二:清除变量
三:处理分类变量
将名义变量准换位哑变量
对于多个可以根据数据的特征进行分箱处理
四:处理时间变量
转换位时间长度,准换为季节信息
五:异常值
更正1、对于不稳健模型删除(回归模型K均值,ADABOOST,)2、对于稳健模型,不处理
六:极值
极值会对有些模型(那些模型还不知道,或许在建模过程中可以试试)产生很大的影响,需要对数据进行对数变换
七:数据分箱
1、适用情景
某些变量在测量时存在随机误差
自变量有大量不重复的取值
有些算法只能适用分类变量,需要对连续型变量离散化
2、常用方法
无监督分箱:等频分箱,等宽分箱,基于K均值分箱
有监督分箱:最小熵分箱
八:缺失数据
九:降维
一些简单的变量选择的方法
对于二分类变量使用T分布检验变量对因变量是否显著对于多分类变量,可使用T检验,或者卡方检验,选择那些对对因变量的任何一对取值都显著的变量
对于数值变量,计算自变量与因变量之间的相关系数,
逐步选择,向前向后选择,两者结合
十过抽样和欠抽样
第三章缺失数据
数据的缺失值分为完全随机缺失,随机缺失,非随机缺失(如何判别还是没搞清楚)
缺失值的插补:
一:显式建模
无条件均值插补,无条件抽样,条件均值,条件抽样
二:单调缺失模式的显式插补
三:一般缺失模式的显示插补
满足多元正态分布时使用马可夫链蒙特卡洛算法进行插补
使用mice方法进行插补
缺失数据的查看
    def missing_values_table(df):
    mis_val = df.isnull().sum() # 总缺失值
    mis_val_percent = 100 * df.isnull().sum() / len(df) # 缺失值比例
    mis_val_table = pd.concat([mis_val, mis_val_percent], axis = 1) # 缺失值制成表格
    mis_val_table_ren_columns = mis_val_table.rename(columns = {0:'Missing Values',
                                                               1:'% of Total Values'})
    mis_val_table_ren_columns = mis_val_table_ren_columns[
        mis_val_table_ren_columns.iloc[:,1] != 0].sort_values('% of Total Values',ascending=False).round(1)
    # 缺失值比例列由大到小排序
    
    print('Your selected dataframe has {} columns.\nThere are {} columns that have missing values.'.format(df.shape[1], mis_val_table_ren_columns.shape[0]))
    # 打印缺失值信息
    
    return mis_val_table_ren_columns
    
    missing_values_table(data)
            # 获取缺失值比例 > 50% 的列
    missing_df = missing_values_table(data)
    missing_columns = list(missing_df[missing_df['% of Total Values'] > 50].index)
    print('We will remove %d columns.' % len(missing_columns))
    
    # 删除缺失值比例高于50%的列
    data = data.drop(columns = list(missing_columns))
        缺失值的MICE插补
    %matplotlib inline
    import missingno as msno
    msno.matrix(data, figsize = (16, 5))
        缺失值的拉格朗日插补法
    from scipy.interpolate import lagrange
    x = [3, 6, 9]
    y = [10, 8, 4]
    print(lagrange(x,y))
    print(type(lagrange(x,y)))# 输出值为的是多项式的n个系数
    # 这里输出3个值,分别为a0,a1,a2
    # y = a0 * x**2 + a1 * x + a2 → y = -0.11111111 * x**2 + 0.33333333 * x + 10
     print('插值10为:%.2f' % lagrange(x,y)(10)) # -0.11111111*100 + 0.33333333*10 + 10 = -11.11111111 + 3.33333333 +10 = 2.22222222# 插值10为:2.22
     data = pd.Series(np.random.rand(100)*100)
     data[3,6,33,56,45,66,67,80,90] = np.nan  
     data_c = data.fillna(data.median())  #  中位数填充缺失值
     fig,axes = plt.subplots(1,4,figsize = (20,5))
     data.plot.box(ax = axes[0],grid = True,title = '数据分布')
     data.plot(kind = 'kde',style = '--r',ax = axes[1],grid = True,title = '删除缺失值',xlim = [-50,150])
     data_c.plot(kind = 'kde',style = '--b',ax = axes[2],grid = True,title = '缺失值填充中位数',xlim = [-50,150])# 密度图查看缺失值情况
     def na_c(s,n,k=5):    
     y = s[list(range(n-k,n+1+k))] # 取数    
     y = y[y.notnull()]  # 剔除空值    
     return(lagrange(y.index,list(y))(n))# 创建函数,做插值,由于数据量原因,以空值前后5个数据(共10个数据)为例做插值 
     na_re = []
     for i in range(len(data)):    
    if data.isnull()[i]:        
     	data[i] = na_c(data,i)        
    	print(na_c(data,i))        		
    	na_re.append(data[i])
    	data.dropna(inplace=True)  # 清除插值后仍存在的缺失值
     	data.plot(kind = 'kde',style = '--k',grid = True,title = '拉格朗日插值后',xlim = [-50,150])
     	print('finished!')
        关联规则挖掘
关联规则主要讲通过频繁项集找出关联性很强的商品,课本使用的是Apriori算法,这个算法其实很简单,就是通过频率来选出购物篮中的商品,具体的过程
关联规则支持度,A–>B的支持度定义为数据集D的观测中同时包含AB中所有项的比例。
A–>B置信度,数据集中包含A的观测集中同时包含B的比例。
A–>B提升值:该规则的置信度和B的支持度的比例,等价于B给定A的条件概率密度与B的边缘密度之比。
算法网址
Apriori算法和FpGrowth的区别是一个是纵向一个是横向的,FPGrowth的计算速度快原因是首先记录了各数的频率,在往上加的时候是从整理好的FPTree上进行挖掘,不是在原有的数据中进行(有点不是很明白)
多元统计中的降维方法
主成分分析法
定义:构造输入变量的少数线性组合,尽可能的解释数据的变异性,这些线性组合称为主成分。
(高维到低维的映射其实就是乘一个矩阵?)
主成分之间的相关结论:
1、各主成分之间互不线性相关
2、各主成分的方差为原随机变量的协方差矩阵的对角线上的数值
3、主成分是原随机变量的线性组合
4、主成分的含义:表示根据系数较大的输入变量的含义来解释主成分的含义
主成分个数的选择
5、计算主成分与各输入变量的相关系数,根据那些对应 相关系数的绝对值较大的输入变量的含义来解释主成分的含义
1、Kaiser准则:保留特征值大于所有特征值的平均的主成分
2、总方差中被前Q个主成分解释的比例达到一定大小
3、保留主成分中具有解释意义的成分
4、使用崖底碎石图
探索性因子分析
每个输入变量的变异性都可以归纳为少数潜在的公共因子和一个与这个公共因子的无关而只与该变量有关的特殊因子
公共因子用载荷矩阵来解释
载荷矩阵初始值的估计,主成分,最大似然估计
优化:正交旋转,最大方差旋转,
实际操作因子分析法
    #充分性检测
    print('巴特利球形度检验')
    from factor_analyzer.factor_analyzer import calculate_bartlett_sphericity
    chi_square_value,p_value=calculate_bartlett_sphericity(df_model)
    print('卡方值:',chi_square_value,'P值', p_value)
    #相关性检验kmo要大于0.6
    from factor_analyzer.factor_analyzer import calculate_kmo
    kmo_all,kmo_model=calculate_kmo(df_model)
    print('KMO检验:',kmo_model)
    #做碎石图确定因子个数
    #查看相关矩阵特征值
    fa = FactorAnalyzer(18, rotation='varimax',method='principal',impute='mean')
    fa.fit(df_model)
    ev, v = fa.get_eigenvalues()
    print('相关矩阵特征值:',ev)
    #Create scree plot using matplotlib
    plt.figure(figsize=(8, 6.5))
    plt.scatter(range(1,df_model.shape[1]+1),ev)
    plt.plot(range(1,df_model.shape[1]+1),ev)
    plt.title('碎石图',fontdict={'weight':'normal','size': 25})
    plt.xlabel('因子',fontdict={'weight':'normal','size': 15})
    plt.ylabel('特征值',fontdict={'weight':'normal','size': 15})
    plt.grid()
    # plt.savefig('E:/suishitu.jpg')
    plt.show()
    #确定因子个数
    n_factors = sum(ev>1)
    #5.根据确定的因子个数进行因子分析,获取方差贡献率和因子得分
    #取旋转后的结果
    fa2 = FactorAnalyzer(n_factors,rotation='varimax',method='principal')
    fa2.fit(df_model)
    #给出贡献率
    var = fa2.get_factor_variance()
    
    #计算因子得分
    fa2_score = fa2.transform(df_model)
    
    #得分表
    column_list = ['fac'+str(i) for i in np.arange(n_factors)+1]
    fa_score = pd.DataFrame(fa2_score,columns=column_list)
    for col in fa_score.columns:
    data[col] = fa_score[col]
    print("\n各因子得分:\n",fa_score)    
    
    #方差贡献表
    df_fv = pd.DataFrame()
    df_fv['因子'] = column_list
    df_fv['方差贡献'] = var[1]
    df_fv['累计方差贡献'] = var[2]
    df_fv['累计方差贡献占比'] = var[1]/var[1].sum()
    print("\n方差贡献表:\n",df_fv)  
    #计算综合得分及排名
    data['factor_score'] = ((var[1]/var[1].sum())*fa2_score).sum(axis=1)
    data = data.sort_values(by='factor_score',ascending=False).reset_index(drop=True)
    data['rank'] = data.index+1
    data.iloc[:,-8:]
        主成分分析法
    ##加载PCA模型并训练、降维
    model_pca = PCA(n_components=3)
    X_pca = model_pca.fit(iris_X).transform(iris_X)
    print(iris_X.shape)
    print(iris_X[0:5])
    print(X_pca.shape)
    print(X_pca[0:5])
    model_pca = PCA(n_components=3)
    X_pca = model_pca.fit(iris_X).transform(iris_X)
    print("降维后各主成分方向:\n",model_pca.components_)
    print("降维后各主成分的方差值:",model_pca.explained_variance_)
    print("降维后各主成分的方差值与总方差之比:",model_pca.explained_variance_ratio_)
    print("奇异值分解后得到的特征值:",model_pca.singular_values_)
    print("降维后主成分数:",model_pca.n_components_)
    fig = plt.figure(figsize=(10,8))
    ax = Axes3D(fig,rect=[0, 0, 1, 1], elev=30, azim=20)
    ax.scatter(X_pca[:, 0], X_pca[:, 1], X_pca[:, 2], marker='o',c=iris_y)
        聚类分析
K均值聚类
初始化K各类别的中心
在每次循环中将每个观测重新分配到类别中心与她距离最小的类
重新计算类的中心,持续循环直到所有的类的中心改变很小或者达到事先规定的最大循环次数
层次聚类
合并式层次聚类
首先将各数据划分为一类,合并各类别
分裂式层次聚类
将所有观测归为一类,迭代的选取能分裂的最不相似的的两个子列,
随着分裂次数的增加每个观测值最终单独形成一个类别
需要调整的参数:簇之间的距离如何定义
鸢尾花聚类案例
    #############K-means-鸢尾花聚类############
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn.cluster import KMeans
    #from sklearn import datasets
    from sklearn.datasets import load_iris
    iris = load_iris()
    X = iris.data[:] ##表示我们只取特征空间中的后两个维度
    #绘制数据分布图
    plt.scatter(X[:, 0], X[:, 1], c = "red", marker='o', label='see')
    plt.xlabel('petal length')
    plt.ylabel('petal width')
    plt.legend(loc=2)
    plt.show()
     
     
    estimator = KMeans(n_clusters=3)#构造聚类器
    estimator.fit(X)#聚类
    label_pred = estimator.labels_ #获取聚类标签
    #绘制k-means结果
    x0 = X[label_pred == 0]
    x1 = X[label_pred == 1]
    x2 = X[label_pred == 2]
    plt.scatter(x0[:, 0], x0[:, 1], c = "red", marker='o', label='label0')
    plt.scatter(x1[:, 0], x1[:, 1], c = "green", marker='*', label='label1')
    plt.scatter(x2[:, 0], x2[:, 1], c = "blue", marker='+', label='label2')
    plt.xlabel('petal length')
    plt.ylabel('petal width')
    plt.legend(loc=2)
    plt.show()
        提供另外一篇关于鸢尾花K均值聚类算法,提及网格搜索法寻找最优参数
预测性建模分析
线性判别分析和二次判别分析
线性判别分析要求:各类别观测的自变量满足多元正态分布,所有类别的协方差阵都相等,
二次判别分析不要求协方差阵相等
    import numpy as np
    from sklearn.lda import LDA
    clf = LDA()
    clf.fit(x,y)
    print(clf.predict(x1))
        