由于高等数学底子太差的原因,机器学习无法深入学习下去,只能做一个简单的尝试者,甚至连调优也未必能算的上,不过这样也好,可以把重心放到对业务的理解上,以及业务和模型的选择上。
线性模型包括了传统的线性回归、岭回归、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)