手记

【学习打卡】第13天 Python3入门机器学习

课程介绍


课程名称:Python3入门机器学习 经典算法与应用 入行人工智能
课程章节:5-8;5-9;5-10
主讲老师:liuyubobobo

内容导读


  • 第一部分 使用scikit-learn解决回归问题
  • 第二部分 线性回归的可解释性和更多思考

课程详细


- 第一部分 使用scikit-learn解决回归问题

准备工作

#导入包和机器学习包的数据并赋予
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
boston = datasets.load_boston()
#给数据
X = boston.data
y = boston.target
#排除干扰
X  = X[y < 50]
y = y[y < 50]
#对数据进行分割并随机排序,
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=666)

sklearn中的线性回归

#导入线性回归
from sklearn.linear_model import LinearRegression
#创建对象
lin_reg = LinearRegression()
#拟合参数
lin_reg.fit(X_train, y_train)
#查看系数
lin_reg.coef_
#array([[-1.39388567e-01,  3.51268728e-02, -7.08648182e-02,
#         8.48567503e-01, -1.44800205e+01,  4.95382181e+00,
#        -5.93375026e-02, -1.27416570e+00,  2.49799373e-01,
#        -1.44898728e-02, -8.89101701e-01,  7.96101324e-03]])
#查看参数
lin_reg.intercept_
#array([25.71193112])
#得出预测y值
y_predict = lin_reg.predict(X_test)
#得出R2型准确度
lin_reg.score(X_test, y_test)
#0.7788559306170952

利用knn解决回归问题

from sklearn.neighbors import KNeighborsRegressor

knn_reg = KNeighborsRegressor()
knn_reg.fit(X_train, y_train)
knn_reg.score(X_test, y_test)
#准确率不高,接下来对超参数进行调整

#先定义一个参数,数组
#这里一共搜索两组数据,
from sklearn.model_selection import GridSearchCV
param_grid = [
    {
        'weights': ['uniform'], 
        'n_neighbors': [i for i in range(1, 11)]
    },
    {
        'weights': ['distance'],
        'n_neighbors': [i for i in range(1, 11)], 
        'p': [i for i in range(1, 6)]
    }
]
#创建对象
knn_reg = KNeighborsRegressor()
#传入对象以及参数,n_jobs为是否并行,verbose为输出文本内容
grid_search = GridSearchCV(knn_reg, param_grid, n_jobs=-1, verbose=1)
grid_search.fit(X_train, y_train)

#最好的参数
grid_search.best_params_
##最好的参数
grid_search.best_params_
#最好的参数
grid_search.best_params_
{'n_neighbors': 8, 'p': 1, 'weights': 'distance'}
#这一次没有过拟合,难道是我的特征没有训练量多吗
#交叉验证的准确度
grid_search.best_score_
#0.6059827822531278

- 第二部分 线性回归的可解释性和更多思考

#导入参数
import numpy as np
from sklearn import datasets

boston = datasets.load_boston()

X = boston.data
y = boston.target

X = X[y < 50]
y = y[y < 50]

#进行机器运算
from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(X, y)

#查看系数,其实这个就是说明这12项特征对于房价的正相关和负相关程度
lin_reg.coef_
#array([-1.06715912e-01,  3.53133180e-02, -4.38830943e-02,  #、4.52209315e-01,
#       -1.23981083e+01,  3.75945346e+00, -2.36790549e-02, -1.21096549e+00,
#       2.51301879e-01, -1.37774382e-02, -8.38180086e-01,  7.85316354e-03,
#     -3.50107918e-01])

#将系数从小到大排序,最靠前的,为负的最大的,最靠后的为最大的
#从负相关影响最大,到正相关
np.argsort(lin_reg.coef_)
#array([ 4,  7, 10, 12,  0,  2,  6,  9, 11,  1,  8,  3,  5], dtype=int64)

#找出特征名称并排序
boston.feature_names[np.argsort(lin_reg.coef_)]
array(['NOX', 'DIS', 'PTRATIO', 'LSTAT', 'CRIM', 'INDUS', 'AGE', 'TAX',
       'B', 'ZN', 'RAD', 'CHAS', 'RM'], dtype='<U7')

#查看文档用于解释特证名
print(boston.DESCR)
#最大- RM  房间数量越多对房价升高影响越大
#第二大 -CHAS  房子是否临河对房价升高影响越大
#最小 - NOX 一氧化氮的浓度对房价降低影响越大
#第二小 - DIS  距离劳务派遣中心距离越大房价越低,距离越小房价越高
#非常合理,这就是线性回归的可解释性
#可以通过,这里看出什么数据他是需要的,重要的,从而采集更有针对性的数据

 - CRIM     per capita crime rate by town
        - ZN       proportion of residential land zoned for lots over 25,000 sq.ft.
        - INDUS    proportion of non-retail business acres per town
        - CHAS     Charles River dummy variable (= 1 if tract bounds river; 0 otherwise)
        - NOX      nitric oxides concentration (parts per 10 million)
        - RM       average number of rooms per dwelling
        - AGE      proportion of owner-occupied units built prior to 1940
        - DIS      weighted distances to five Boston employment centres
        - RAD      index of accessibility to radial highways
        - TAX      full-value property-tax rate per $10,000
        - PTRATIO  pupil-teacher ratio by town
        - B        1000(Bk - 0.63)^2 where Bk is the proportion of black people by town
        - LSTAT    % lower status of the population
        - MEDV     Median value of owner-occupied homes in $1000's

课程思考


上一次,使用KNN算法解决回归问题,在发现准确度不高使用GridSearchCV也就是网格搜索之后,数据过拟合了,但是这一次没有,我对比复盘了一下,我觉得可能是数据量的增加这个原因

线性回归从可解释性角度来讲比KNN算法要强很多,线性回归对算出来的数据具有很强的可解释性,我们可一通过创建模型,解读模型来确定选取什么数据进行再度创建模型,来达到更好的效果。
以上述例子为例,可以看出一氧化氮浓度,临河,房间数量,距离工作地点距离,对房价影响很大,我们就可以加大这几方面的数据收集,以确保在下次达到更好的,准确度。

课程截图


1人推荐
随时随地看视频
慕课网APP