python——cross_val_score()函数、ShuffleSplit()函数、zip()函数

cross_val_score():

# cross_val_score(estimator, X, y=None, scoring=None, cv=None, n_jobs=1)
# 该函数用交叉检验(cross-validation)来估计一个模型的得分
# estimator:需要一个模型对象
# X和y分别表示自变量和因变量
# scoring:需要string, callable or None,表示通过哪个机制来打分
#              scoring='r2'根据r2(判定系数)来评价模型
# cv: 需要int,cross_validation generator or an iterable,默认为3重交叉检验
#     *int:表示交叉检验的重数, int=n代表n重交叉检验
#     *cross_validation generator:一个交叉检验生成器的对象
#     *an iterable:一个迭代器,它可以限制训练集和测试集的划分
# n_jobs=1:计算时使用的CPU的数量,-1代表使用所有的CPU
# cross_val_score的返回值是一个数组,数组中的元素是每次交叉检验模型的得分。

ShuffleSplit():

# ShuffleSplit(n_splits=10,test_size=0.1,train_size=None,random_state=None)是一个交叉检验迭代器
# n_splits: 代表迭代次数,默认为10。每迭代一次就按照test_size或者train_size生成相应的训练集和测试集
# test_size: 需要float, int or None,默认值为0.1
#            *float: 该float型数字必须在0和1之间,代表测试集数据占总数据的比例
#            *int: 表示测试集的数据量个数
#            *None: 表示测试集为训练集的补集(前提是指定了训练集的数量或比例)
# train_size: 赋值规则和test_size一样

使用交叉验证来估计一个模型的得分:

例1:使用cross_val_score()和ShuffleSplit()

from sklearn.model_selection import cross_val_score, ShuffleSplit
from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor

# Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
print('X.shape: \n', X.shape)
print(len(X))
print('Y.shape: \n', Y.shape)
print('names: \n', names)

rf = RandomForestRegressor(n_estimators=20, max_depth=4)
scores = []
# 每次选取一个特征,用它和因变量来训练模型
# X.shape[1]为X的列数即样本的特征数
for i in range(X.shape[1]):
    # cv=len(X)和cv=ShuffleSplit(n_splits=len(X), test_size=0.3)虽然都是n重交叉检验
    # 但是cv=len(X)并不能指定测试集和训练集的划分比例
    score = cross_val_score(rf, X[:, i:i + 1], Y, scoring="r2",
                            cv=ShuffleSplit(n_splits=len(X), test_size=0.3))
    # print('score_shape: \n', score.shape)
    # n重交叉检验,cross_val_score返回一个有n个值(得分)的数组
    # 所以给cross_val_score的返回值取均值作为模型的最终得分
    scores.append((round(np.mean(score), 3), names[i]))

# sorted默认为升序,reverse=True指定为降序
scores = sorted(scores, reverse=True)
print(scores)
结果为:
X.shape: 
 (506, 13)
506
Y.shape: 
 (506,)
names: 
 ['CRIM' 'ZN' 'INDUS' 'CHAS' 'NOX' 'RM' 'AGE' 'DIS' 'RAD' 'TAX' 'PTRATIO'
 'B' 'LSTAT']
[(0.644, 'LSTAT'), (0.547, 'RM'), (0.406, 'NOX'), (0.371, 'INDUS'), (0.311, 'PTRATIO'), (0.294, 'TAX'), (0.201, 'CRIM'), (0.189, 'RAD'), (0.185, 'ZN'), (0.109, 'B'), (0.076, 'AGE'), (0.072, 'DIS'), (0.012, 'CHAS')]

例2:使用ShuffleSplit()

from sklearn.model_selection import ShuffleSplit
from sklearn.metrics import r2_score
import numpy as np
from sklearn.ensemble import RandomForestRegressor
from sklearn.datasets import load_boston

boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston['feature_names']
print('names: \n', names)
rf = RandomForestRegressor()
# 定义n重交叉验证中测试集和训练集所占的比例
shuffle_split = ShuffleSplit(len(X), 100, .3)
# 取出n重交叉验证中的测试集和训练集并建立模型
acc = []
for train_idx, test_idx in shuffle_split.split(X):
    X_train, X_test = X[train_idx], X[test_idx]
    Y_train, Y_test = Y[train_idx], Y[test_idx]
    r = rf.fit(X_train, Y_train)
    acc.appand(r2_score(Y_test, rf.predict(X_test)))
# 对n个模型的精度求平均
print('acc_mean: \n', np.mean(acc))

zip():

# zip(iter1 [,iter2 [...]]) --> zip object
# zip()可以将多个迭代器按照每个迭代器中的元素顺序从第一个开始压缩,直到最短的迭代器遍历完结束,返回一个zip对象。
# 例如:
# iter1 = ['yx', 22, '男']
# iter2 = ['name', 'age', 'sex', 'class']
# zp = zip(iter1, iter2)就将'yx'和'name'一起压缩,22和'age'一起压缩,'男'和'sex'一起压缩,然后结束。
# 获取压缩值的方法:
# 1:zp.__next__()可以得到('yx', 'name'),接着再次调用__next__()就可以得到(22, 'age')
# 2:for循环
#       for i, j in zp:
#           print((i, j))

你可能感兴趣的:(机器学习,python)