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