当前位置:首页 > 运营 > 正文

一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)

全文共7366字,预计学习时长30分钟或更长

一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)  第1张

图片来源:https://techdifferences.com/wp-content/uploads/2018/01/Untitled-2.jpg

一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)  第2张

混淆矩阵

运行模型做出预测之前,理解目标变量的特征尤为重要。若应该使用分类模型却误用了回归模型,会得出一堆连续的预测,而非离散标签。而因为大多数(或全部)预测并非你想得出的1或0值,会导致推测出一个较低的F分数(也可能为0)。如果使用得出概率的逻辑模型,有一个方法是设定一个边界值。比如,假定任何大于0.9的值即为1,任何小于0.9的值为0,你仍然会得出一个F分数和混淆矩阵。但使用合适的模型通常可以避免这项额外的步骤。

一旦决定了要使用的方法,接下来就要选择模型进行预测。

一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)  第3张

泰坦尼克事件的随机森林分类

现在你可能会想,难道不能用这些模型预测概率目标变量吗?如果训练组的y值在0到1之间,那么模型的预测y值也在0到1之间,是吧?是,也不是。

大多数情况下,模型预测的y值都在0到1之间。但如果模型为线性,则低于0或高于1的概率值是非逻辑回归的。你可以在模型建构中付出110%的努力,但一个观察被分为某一类的概率不可能达到110%。

而且,在线性模型中,诊断患病的概率分别为10%和15%的人群之间的不同就相当于诊断患病概率为95%和1%的人群之间的不同。显然,如果某人100%患病,那么这一点在线性模型中就不会体现,因为此数据对于低于50%的概率而言影响极小。

一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)  第4张分类模型

如果分析是为了构建模型以预测观察标签,那么就得使用分类模型。最简单的分类模型就是逻辑模型。然而,通过创建假目标变量并对各变量应用逻辑模型,我们能够训练非二进制目标变量的逻辑模型。你也可以对此逻辑模型导入L1和L2惩罚项,从而运行拉索和岭逻辑模型。

随机森林分类则更有助于推测。和随机森林回归一样,随机森林分类包含仅在特定情况下有影响的特征。随机森林分类的机制同上,其采取决策树的概念以创建一个随机森林,并随机选择变量,最终基于森林得出预测。在应用模型的编码中,可以看到许多超参数,比如决策树的数量、每一片树叶上的最小观察数、最大分裂数、决策树的最大深度等。这些超参数有助于构建一个更为精准的模型,但随机森林仍有可能过度拟合。如果决策树太大,那么它们很可能过于具体,因此无法应用于测试组。

一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)  第5张总结

选择预测模型时,首要考虑的问题是目标变量的特征。目标变量是持续的还是离散的?变量是量还是标签?变量是概率还是类别?变量与所有解释变量存在线性相关性吗?需要在预测中包含所有的变量吗?思考这些问题的答案有助于你挑选出最佳预测模型。

一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)  第6张

源代码及运行对比:

Regression

In [0]:import sklearnfrom sklearn.linear_model import ElasticNet, Lasso, Ridge, LogisticRegression, LinearRegressionfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import mean_squared_errorfrom sklearn.ensemble import RandomForestRegressorimport pandas as pdimport matplotlibfrom matplotlib import pyplotdef warn(*args, **kwargs): passimport warningswarnings.warn = warnIn [0]:from google.colab import filesuploaded = files.upload()In [0]:data = pd.read_csv("avocado.csv")data = data.drop(['Unnamed: 0','Date', 'region','Total Volume','Total Bags'], axis = 1)data = pd.get_dummies(data, drop_first=True)y = data['AveragePrice']X = data.drop('AveragePrice', axis=1)X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=.1)In [250]:lm = LinearRegression()lm_fit = lm.fit(X_train, y_train)lm_predict = lm_fit.predict(X_test) #lr = LogisticRegression()#lr_fit = lr.fit(X_train,y_train)#lr_predict = lr_fit.predict(X_test)## will not work because the range of y is 0 to 3.25, not 0 to 1 ridge = Ridge()ridge_fit = ridge.fit(X_train,y_train)r_predict = ridge_fit.predict(X_test) lasso = Lasso(max_iter=1000)lasso_fit = lasso.fit(X_train,y_train)l_predict = lasso_fit.predict(X_test) ENet = ElasticNet(l1_ratio=.01)ENet_fit = ENet.fit(X_train,y_train)en_predict = ENet_fit.predict(X_test) ## there are no higher order variables in this dataset, but for the sake of exemplifying the procedure,## pretend there is a quadratic relationship between the number of 4225 avocados and the pricedata1 = data.head(500)data1['4225_sq'] = 0for i in range(len(data1['4225'])): data1['4225_sq'][i] = (data1['4225'][i])**2y2 = data1['AveragePrice']X2 = data1.drop('AveragePrice', axis=1)X_train2, X_test2, y_train2, y_test2 = train_test_split(X2,y2, test_size=.1)lm_fit = lm.fit(X_train2, y_train2)ho_predict = lm_fit.predict(X_test2) rand = RandomForestRegressor()rand_fit = rand.fit(X_train,y_train)rf_predict = rand_fit.predict(X_test)/usr/local/lib/python3.6/dist-packages/sklearn/ensemble/forest.py:245: FutureWarning: The default value of n_estimators will change from 10 in version 0.20 to 100 in 0.22. "10 in version 0.20 to 100 in 0.22.", FutureWarning)In [252]:print('Linear Model MSE:' , mean_squared_error(y_test,lm_predict))#mean_squared_error(y_test,lr_predict)print('Ridge Model MSE:' , mean_squared_error(y_test,r_predict))print('Lasso Model MSE:' , mean_squared_error(y_test,l_predict))print('Elastic Net Model MSE:',mean_squared_error(y_test,en_predict))print('Higher Order Model MSE:' ,mean_squared_error(y_test2,ho_predict))print('Random Forest MSE:' ,mean_squared_error(y_test,rf_predict))Linear Model MSE: 0.09792038897928204Ridge Model MSE: 0.09791772364668704Lasso Model MSE: 0.14654262570004578Elastic Net Model MSE: 0.12919487097231586Higher Order Model MSE: 0.015512612920132457Random Forest MSE: 0.034497292054794515

Classification

In [0]:import sklearnfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifierfrom sklearn.neural_network import MLPClassifierfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import f1_score, confusion_matriximport pandas as pdIn [0]:from google.colab import filesuploaded = files.upload()In [0]:data = pd.read_csv("train.csv")data = data.drop(['Name','Ticket','Cabin'], axis=1)data = pd.get_dummies(data)data = data.fillna(0) y = data['Survived']X = data.drop('Survived', axis=1)X_train, X_test, y_train, y_test = train_test_split(X,y, test_size=.1)In [236]:data.head()Out[236]:一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)  第7张

In [0]:lr = LogisticRegression()lr_fit = lr.fit(X_train,y_train) lasso2 = LogisticRegression(penalty='l1')lasso2_fit = lasso2.fit(X_train,y_train) ridge2 = LogisticRegression(penalty='l2')ridge2_fit = ridge2.fit(X_train,y_train) rand_for = RandomForestClassifier(n_estimators = 500, random_state = 40)rand_for_fit = rand_for.fit(X_train,y_train) clf = MLPClassifier(activation='logistic', solver='lbfgs',learning_rate='adaptive', alpha=.0005)clf_fit = clf.fit(X_train, y_train)In [273]:print('Logistic F Score:',lr_fit.score(X_test, y_test))print('LASSO F Score:',lasso2_fit.score(X_test, y_test))print('Ridge F Score:',ridge2_fit.score(X_test, y_test))print('Random Forest Classifier F Score:',rand_for_fit.score(X_test, y_test))print('Neural Net F Score:',clf_fit.score(X_test, y_test))Logistic F Score: 0.8555555555555555LASSO F Score: 0.8555555555555555Ridge F Score: 0.8555555555555555Random Forest Classifier F Score: 0.8777777777777778Neural Net F Score: 0.7333333333333333一般线性模型和回归的区别(回归or分类线性or逻辑一文掌握模型的不同之处)  第8张

留言 点赞 关注

我们一起分享AI学习与发展的干货

欢迎关注全平台AI垂类自媒体 “读芯术”

取消
扫码支持 支付码