机器学习线性模型训练:线性回归和逻辑回归

来源: 网络 日期:2021-02-18

由于高等数学底子太差的原因,机器学习无法深入学习下去,只能做一个简单的尝试者,甚至连调优也未必能算的上,不过这样也好,可以把重心放到对业务的理解上,以及业务和模型的选择上。

线性模型包括了传统的线性回归、岭回归、Lasso回归,主要用于连续值的预测;逻辑回归虽然也是回归,但却是一种分类方法;LDA线性判别分析,则是一种降维方法;多项式回归,是使用线性模型训练数据的非线性函数。

总的来说,尝试着回顾一下,也挺有意思的。

import matplotlib.pyplot as pltimport numpy as npfrom sklearn import datasets,linear_model,discriminant_analysis,model_selecTIon,preprocessingfrom sklearn.pipeline import make_pipeline,Pipelinedef load_data():    diabetes=datasets.load_diabetes()    # datasets.load_diabetes()定义    # C:\Python\Python37\Lib\site-packages\sklearn\datasets\_base.py    #     return Bunch(data=http://www.elecfans.com/rengongzhineng/data, target=target, DESCR=fdescr,>1:对每个子模型都输出    #   warm_start=False : 是否热启动,如果是,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。布尔型,默认False。    #   n_jobs=1 : 并行数,int:个数;-1:跟CPU核数一致;1:默认值。    # Attributes    #        coef_:返回模型的估计系数。    #        intercept_:线性模型的独立项,一维情形下的截距。    #        n_iter:实际迭代次数。    # Methods    #   fit(X, y, sample_weight=None)    #           拟合模型,用来训练LR分类器,其中X是训练样本,y是对应的标记向量    #           返回对象,self。    #   fit_transform(X, y=None, **fit_params)    #       fit与transform的结合,先fit后transform。返回X_new:numpy矩阵。    #   predict(X)    #       用来预测样本,也就是分类,X是测试集。返回array。    #   predict_proba(X)    #       输出分类概率。返回每种类别的概率,按照分类类别顺序给出。如果是多分类问题,multi_class="multinomial",则会给出样本对于每种类别的概率。    #       返回array-like。    #   score(X, y, sample_weight=None)    #       返回给定测试集合的平均准确率(mean accuracy),浮点型数值。    #       对于多个分类返回,则返回每个类别的准确率组成的哈希矩阵。    X_train, X_test, y_train, y_test = data    regr = linear_model.LogisticRegression()    regr.fit(X_train, y_train)    coef = regr.coef_    intercept = regr.intercept_    trainscore = regr.score(X_train, y_train)    testscore = regr.score(X_test, y_test)    trainpredict = regr.predict(X_train)    testpredict = regr.predict(X_test)    meansquareerror = np.mean((regr.predict(X_test) - y_test) ** 2)    equalscore = np.mean(regr.predict(X_test) == y_test)    # print('Coefficients={},intercept={}'.format(coef,intercept))    # # Coefficients=[[-0.38340846  0.86187824 -2.27003634 -0.9744431 ]    # #  [ 0.34360292 -0.37876116 -0.03099424 -0.86880637]    # #  [ 0.03980554 -0.48311708  2.30103059  1.84324947]]    # # intercept=[  8.75830949   2.49431233 -11.25262182]    # print('Residual sum of squares={}'.format(meansquareerror))    # # Residual sum of squares=0.0    # print('trainscore={:.2f}'.format(trainscore))    # # trainscore=0.9553571428571429    # print('testscore={:.2f}'.format(testscore))    # # testscore=1.0    # print('equalscore={:.2f}'.format(equalscore))    # # standardscore=1.00    # print('trainpredict={}'.format(trainpredict))    # print('testpredict={}'.format(testpredict))def test_Logistic_Regression_C(*data):    X_train, X_test, y_train, y_test = data    Cs=np.logspace(-2,4,num=100)    scores = []for C in Cs:        regr = linear_model.LogisticRegression(C=C)        regr.fit(X_train, y_train)        scores.append(regr.score(X_test, y_test))    fig = plt.figure()    ax = fig.add_subplot(1, 1, 1)    ax.plot(Cs, scores)    ax.set_xlabel(r'C')    ax.set_ylabel(r'score')    ax.set_xscale('log')    ax.set_title('LogisicRegrssion')    plt.show()# 线性判别分析回归def test_LDA(*data):    # ElasticNet回归是对Lasso回归和Ridge回归的融合,利用了L1和L2范数的融合,所以在参数中除了alpha之外还有L1_ratio 默认alpha=1,l1_ratio=0.5    # Parameters    #   solver:一个字符串,指定了求解最优化问题的算法,可以为如下的值。    #       'svd':奇异值分解。对于有大规模特征的数据,推荐用这种算法。    #       'lsqr':最小平方差,可以结合skrinkage参数。    #       'eigen' :特征分解算法,可以结合shrinkage参数。    #   skrinkage:字符串‘auto’或者浮点数活者None。该参数通常在训练样本数量小于特征数量的场合下使用。该参数只有在solver=lsqr或者eigen下才有意义    #       '字符串‘auto’:根据Ledoit-Wolf引理来自动决定shrinkage参数的大小。    #       'None:不使用shrinkage参数。    #       浮点数(位于~1之间):指定shrinkage参数。    #   priors:一个数组,数组中的元素依次指定了每个类别的先验概率。如果为None,则认为每个类的先验概率都是等可能的。    #   n_components:一个整数。指定了数组降维后的维度(该值必须小于n_classes-1)。    #   store_covariance:一个布尔值。如果为True,则需要额外计算每个类别的协方差矩阵。    #   warm_start:一个布尔值。如果为True,那么使用前一次训练结果继续训练,否则从头开始训练。    #   tol:一个浮点数。它指定了用于SVD算法中评判迭代收敛的阈值。    # ————————————————    # Attributes    #       coef_:权重向量。    #       intercept:b值。    #       covariance_:一个数组,依次给出了每个类别烦人协方差矩阵。    #       means_:一个数组,依次给出了每个类别的均值向量。    #       xbar_:给出了整体样本的均值向量。    #       n_iter_:实际迭代次数。    # Methods    #       fix(X,y):训练模型。    #       predict(X):用模型进行预测,返回预测值。    #       score(X,y[,sample_weight]):返回(X,y)上的预测准确率(accuracy)。    #       predict_log_proba(X):返回一个数组,数组的元素一次是 X 预测为各个类别的概率的对数值。     #       predict_proba(X):返回一个数组,数组元素一次是 X 预测为各个类别的概率的概率值。    X_train, X_test, y_train, y_test = data    lda = discriminant_analysis.LinearDiscriminantAnalysis()    lda.fit(X_train, y_train)    coef = lda.coef_    intercept = lda.intercept_    trainscore = lda.score(X_train, y_train)    testscore = lda.score(X_test, y_test)    trainpredict = lda.predict(X_train)    testpredict = lda.predict(X_test)    meansquareerror = np.mean((lda.predict(X_test) - y_test) ** 2)    equalscore = np.mean(lda.predict(X_test) == y_test)    # print('Coefficients={},intercept={}'.format(coef,intercept))    # # Coefficients=[[  6.66775427   9.63817442 -14.4828516  -20.9501241 ][ -2.00416487  -3.51569814   4.27687513   2.44146469][ -4.54086336  -5.96135848   9.93739814  18.02158943]]    # # intercept=[-15.46769144   0.60345075 -30.41543234]    # print('Residual sum of squares={}'.format(meansquareerror))    # # Residual sum of squares=0.9    # print('trainscore={}'.format(trainscore))    # # trainscore=0.9732142857142857    # print('testscore={}'.format(testscore))    # # testscore=1.0    # print('equalscore={:.2f}'.format(equalscore))    # # equalscore=0.00    # print('trainpredict={}'.format(trainpredict))    # print('testpredict={}'.format(testpredict))def plot_LDA(converted_X,y):    from mpl_toolkits.mplot3d import Axes3D    fig=plt.figure(figsize=(10,5))    ax=Axes3D(fig)    colors='rgb'    markers='o*s'for target,color,marker in zip([,1,2],colors,markers):        pos=(y==target).ravel()        X=converted_X[pos,:]        ax.scatter(X[:,],X[:,1],X[:,2],color=color,marker=marker,label='Label %d'%target)    ax.legend(loc='best')    fig.suptitle('Iirs')    plt.show()def plot_LDA_diff(*data):    X_train, X_test, y_train, y_test = data    X=np.vstack((X_train,X_test))    Y=np.vstack((y_train.reshape(y_train.size,1),y_test.reshape(y_test.size,1)))plot_LDA(X,Y)lda=discriminant_analysis.LinearDiscriminantAnalysis()    lda.fit(X,Y)    convertedX=np.dot(X,np.transpose(lda.coef_))+lda.intercept_plot_LDA(convertedX,Y)def f(x):    randa = np.random.uniform(, 0.5, size=x.shape)    randb = np.random.uniform(, 2, size=x.shape)    randc = np.random.uniform(, 2, size=x.shape)return x*x*(randa+1)-x*(randb+2)-randcdef load_ploy_data():    X=np.linspace(1,100,100)    y = f(X)    c = list(zip(X, y))    np.random.shuffle(c)    newX,newy=zip(*c)    size=20    newX=list(newX)    newy=list(newy)    X_train=np.array(newX[:size])    y_train=np.array(newy[:size])    X_test=np.array(newX[size:])    y_test=np.array(newy[size:])    X = X[:, np.newaxis]    X_train = X_train[:, np.newaxis]    y_train = y_train[:, np.newaxis]    X_test = X_test[:, np.newaxis]    y_test = y_test[:, np.newaxis]return X_train, X_test, y_train, y_test,X,ydef test_PolynomialFeatures(degree,*data):    # 机器学习中一种常见的模式,是使用线性模型训练数据的非线性函数。    # 这种方法保持了一般快速的线性方法的性能,同时允许它们适应更广泛的数据范围。    # 主要参数    #   degree:控制多项式的度    #   interaction_only:默认为False,如果指定为True,那么就不会有特征自己和自己结合的项,上面的二次项中没有a^2和b^2。    #   include_bias:默认为True。如果为True的话,那么就会有上面的 1那一项。    X_train, X_test, y_train, y_test = data    model = Pipeline([('poly', preprocessing.PolynomialFeatures(degree=degree)),                      ('linear', linear_model.LinearRegression())])    model.fit(X_train,y_train)    X=np.vstack((X_train,X_test))    coef = model.named_steps['linear'].coef_    intercept = model.named_steps['linear'].intercept_    y_plot = model.predict(X)print('Coefficients={},intercept={}'.format(coef, intercept))    # Coefficients=[-6.52563764e-09  4.07601927e+01 -2.10719706e+02  5.42901460e+02...]    # intercept=intercept=188.12644759943421def test_PolynomialFeatures_degree(*data):    X_train, X_test, y_train, y_test,X,y = data    plt.scatter(X_train,y_train, color='navy', s=30, marker='o', label="training points")    plt.scatter(X_test, y_test, color='green', s=30, marker='*', label="test points")    colors = ['teal', 'yellowgreen', 'gold','black']for count, degree in enumerate([2 ,3, 4, 5]):        model = Pipeline([('poly', preprocessing.PolynomialFeatures(degree=degree)),                          ('linear', linear_model.LinearRegression())])        model.fit(X_train,y_train)        y_plot=model.predict(X)        plt.plot(X, y_plot, color=colors[count], linewidth=2,label="degree %d" % degree)    plt.legend()plt.show()if __name__ == '__main__':    X_train,X_test,y_train,y_test=load_data()    test_LinearRegression(X_train,X_test,y_train,y_test)    test_Ridge_Regression(X_train,X_test,y_train,y_test)    test_Ridge_alpha(X_train,X_test,y_train,y_test)    test_Lasso_Regression(X_train,X_test,y_train,y_test)    test_Lasso_alpha(X_train,X_test,y_train,y_test)    test_ElasticNet_Regression(X_train,X_test,y_train,y_test)    test_ElasticNet_alpha_rho(X_train,X_test,y_train,y_test)    X_train, X_test, y_train, y_test = load_iris_data()    test_Logistic_Regression(X_train,X_test,y_train,y_test)    test_Logistic_Regression_C(X_train,X_test,y_train,y_test)    test_LDA(X_train,X_test,y_train,y_test)    plot_LDA_diff(X_train,X_test,y_train,y_test)    X_train, X_test, y_train, y_test,X,y = load_ploy_data()    test_PolynomialFeatures(2,X_train,X_test,y_train,y_test)    test_PolynomialFeatures_degree(X_train,X_test,y_train,y_test,X,y)								
    A+
声明:本文转载自其它媒体,转载目的在于传递更多信息,并不代表赞同其观点和对其真实性负责。