机器学习基础功能练习II

机器学习基础功能练习II

一、导入sklearn 数据集

  

from sklearn.datasets import load_diabetes
diabetes = load_diabetes()
"""返回字典,数据集的descr,data,feature_names等关键数据
diabetes.data 是一个矩阵
sklearn.datasets.load_boston
sklearn.datasets.load_breast_cancer
sklearn.datasets.load_diabetes
sklearn.datasets.load_digits
sklearn.datasets.load_files
sklearn.datasets.load_iris
"""
print(diabetes)
print(diabetes.feature_names)
print(diabetes.data)
X = diabetes.data
y = diabetes.target

  

二、分隔数据集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)
test_size=0.3 代表7:3,random_state=1 0~42

  

三、模型训练与预测

from sklearn.linear_model import LinearRegression
model = LinearRegression(copy_X=True, fit_intercept=True, n_jobs=1, normalize=False)

model.fit(X_train, y_train)
y_predict = model.predict(X_test)

  

四、绘制结果图

plt.figure()
plt.plot(range(len(y_predict)), y_predict, 'b', label="predict")
plt.plot(range(len(y_predict)), y_test, 'r', label="test")
plt.legend(loc="upper right")  # 显示图中的标签
plt.xlabel("the x")
plt.ylabel('value')
plt.show()

  

五、线性回归的指标

from sklearn.metrics import explained_variance_score, \
    mean_absolute_error, \
    mean_squared_error, \
    median_absolute_error, r2_score
# 由于回归分析的目标值是连续值,因此我们不能用准确率之类的评估标准来衡量模型的好坏,
# 而应该比较预测值(Predict)和实际值(Actual)之间的差异程度。
# 其中,均方根误差(root-mean-square error,简称 RMSE)是最常见的评估标准之一。
print('数据线性回归模型测试集的平均绝对误差为:',mean_absolute_error(y_test, y_predict))
print('数据线性回归模型测试集的均方误差为:',mean_squared_error(y_test, y_predict))
print('数据线性回归模型测试集的中值绝对误差为:',median_absolute_error(y_test, y_predict))
print('数据线性回归模型测试集的可解释方差值为:',explained_variance_score(y_test, y_predict))
print('数据线性回归模型测试集的R方值为:',r2_score(y_test, y_predict))

  

 

 效果不是很好

数据线性回归模型测试集的平均绝对误差为: 41.64925030150086
数据线性回归模型测试集的均方误差为: 2827.0709606368036
数据线性回归模型测试集的中值绝对误差为: 35.94007730856664
数据线性回归模型测试集的可解释方差值为: 0.4395412676763393
数据线性回归模型测试集的R方值为: 0.4384569849129575

 欠拟合的原因在于: 不是对比测试集和训练集的mse,而是mse在两个数据集都很高。

 六、加入决策树

from sklearn.tree import DecisionTreeRegressor
dtr = DecisionTreeRegressor(criterion="mse", splitter="best",max_depth=3)
dtr.fit(X_train,y_train)
y_pred = dtr.predict(X_test)

  max_depth对结果有很大影响

  第二部需要从数据研究开始 >>>>>>

对比线性回归

plt.plot(range(len(y_pred)),y_pred,"g",label="dtr_pred")

  

 

 

七、交叉验证方法优化模型

  交叉验证的结果是衡量模型性能指标的一种方法。是一种评价方法。

  1 交叉验证有效防止过拟合

  防止过拟合就能在测试集上有好效果

  崔卿解答:“交叉验证怎么避免过拟合呢” 以我的理解,交叉验证并不能避免过拟合,避免过拟合还是有其他很多算法层面的方式,交叉验证主要还是效果调优用

理解:不能防止过拟合,只是评价标准

  2 那么交叉验证怎么避免过拟合呢?

    如使用5折交叉验证,那么测试结果为5个score,也分别对应5个模型,选择score中的中位数对应的那个模型吗?

阿里 崔卿 解答:这个一般选最好的,但不一定就是最好的,验证集/测试集只是评估模型效果的一种方式 问题

理解:比如3折交叉验证,[0.98,0.99,1.00],实际应用中能说明,score在0.99左右,模型堪用。然后选取三号模型。进一步会在业务中评估。

  3 在数据集a训练一个模型后,再放入另一组数据集b训练。

    那么模型相当于在a+b的测试合集上训练出来的还是仅仅是在 数据集b上训练出来的呢?

    sklearn代码如下,如果只是针对sklearn代码来说model是不是只用最后一次fit的训练参数。

    model=LogisticRegression()

    model.fit(Xa,ya)

    

    # 此时再放入Xb,yb中训练

    model.fit(Xb,yb)

阿里 崔卿 解答:2, 会重头训练 https://stackoverflow.com/questions/49841324/what-does-calling-fit-multiple-times-on-the-same-model-do

理解:重新刷新。可以增量训练partial_fit

  4 在5折交叉验证得到5个模型,5组模型参数(W权重),取均值作为模型的最终权重是否可以防止过拟合?

    如果不可行的话,是什么道理呢?

    如果可行的话,sklearn代码需要调用哪个api呢?

 阿里 崔卿 解答:线性模型取均值是可行的,某种程度也可以避免过拟合,但这种方法不常用,如果其中一个模型过拟合很厉害,参数值非常大,则会导致结果依然过拟合或者异常。可以用LinearRegression的attributes coef_来获取参数 https://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html

理解:可行但是保证model中不能有很大过拟合,否则结果还是过拟合。LinearRegression的attributes coef_可修改。

  

model.coef_ = np.array([0 for x in range(10)])

 model.coef_ 返回一个 class numpy.ndarray

posted on 2020-07-07 12:53  lexn  阅读(213)  评论(0编辑  收藏  举报

导航