sklearn
特征工程
(Feature Engineering)
特征工程是使用专业背景知识和技巧处理数据**,**使得特征能在机器学习算法上发挥更好的作用的过程
数据集
scikit-learn 提供了一些标准数据集
from sklearn import datasets
小规模 load_*()
datasets.load_*()
获取小规模数据集,数据包含在 datasets 里
data1 = datasets.load_iris()
data2 = datasets.load_boston()
大规模 fetch_*()
datasets.fetch_*(data_home, subset)
获取大规模数据集,需要从网络上下载
- data_home:数据集下载的目录,默认是 ~/scikit_learn_data/
- subset:选择要加载的数据集。'train'或者'test','all',可选
返回值
load 和 fetch 返回的数据类型为 datasets.base.Bunch (字典继承)
- data:特征数据数组,是二维 numpy.ndarray 数组
- *target:*标签数组,是 n_samples 的一维 numpy.ndarray 数组
- DESCR:数据描述
- feature_names:特征名,新闻数据,手写数字、回归数据集没有
- target_names:标签名
from sklearn.datasets import load_iris
# 获取鸢尾花数据集
iris = load_iris()
print("鸢尾花数据集的返回值:\n", iris) # 将所有参数全部返回,返回值是一个继承自字典的Bench
print("鸢尾花的特征值:\n", iris.data)
print("鸢尾花的目标值:\n", iris.target)
print("鸢尾花特征的名字:\n", iris.feature_names)
print("鸢尾花目标值的名字:\n", iris.target_names)
print("鸢尾花的描述:\n", iris.DESCR)
# 同样可以写作诸如iris['data']的格式
输出
鸢尾花的特征值:
[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
...
[6.3 2.5 5. 1.9]
[6.5 3. 5.2 2. ]
[6.2 3.4 5.4 2.3]
[5.9 3. 5.1 1.8]]
鸢尾花的目标值:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
2 2]
鸢尾花特征的名字:
['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']
鸢尾花目标值的名字:
['setosa' 'versicolor' 'virginica']
鸢尾花的描述:
.. _iris_dataset:
Iris plants dataset
--------------------
**Data Set Characteristics:**
:Number of Instances: 150 (50 in each of three classes)
...
- Many, many more ...
数据集划分
简单划分 train_test_split
from sklearn.model_selection import train_test_split
train_test_split ( arrays, *options )
- x:数据集的特征值
- y:数据集的标签值
- test_size:测试集的大小,一般为 float
- random_state:随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
返回:测试集特征值,测试集标签,训练集特征值,训练集标签(默认随机取)
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=22)
K 折交叉验证
(KFold Cross Validation)
from sklearn.model_selection import KFold
KFold ( n_splits=5, *, shuffle=False, random_state=None )
返回 k 折对象
参数
- n_splits:K 子集个数,int, default=5
- shuffle:是否要洗牌(打乱数据),bool, default=False
- random_state:int or RandomState instance, default=None
方法
- get_n_splits([X, y, groups]):返回迭代次数,Returns the number of splitting iterations in the cross-validator
- split(X):生成器,返回训练和测试集的索引值,Generate indices to split data into training and test set.
from sklearn.model_selection import KFold
from sklearn import datasets
# 数据集导入
iris = datasets.load_iris()
x = iris.data
y = iris.target
# KFold
kf = KFold(n_splits=5)
# 输出划分数
print(kf.get_n_splits(x))
# 划分数据集
for train_index, test_index in kf.split(x):
print("TRAIN:", train_index, "\nTEST:", test_index)
x_train, x_test = x[train_index], x[test_index]
y_train, y_test = y[train_index], y[test_index]
输出
5
TRAIN: [ 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
138 139 140 141 142 143 144 145 146 147 148 149]
TEST: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
24 25 26 27 28 29]
TRAIN: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25 26 27 28 29 60 61 62 63 64 65
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
138 139 140 141 142 143 144 145 146 147 148 149]
TEST: [30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59]
TRAIN: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59 90 91 92 93 94 95 96 97 98 99 100 101
102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
138 139 140 141 142 143 144 145 146 147 148 149]
TEST: [60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
84 85 86 87 88 89]
TRAIN: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
138 139 140 141 142 143 144 145 146 147 148 149]
TEST: [ 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
108 109 110 111 112 113 114 115 116 117 118 119]
TRAIN: [ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
108 109 110 111 112 113 114 115 116 117 118 119]
TEST: [120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
138 139 140 141 142 143 144 145 146 147 148 149]
特征抽取
(feature extraction)
将任意数据(如文本或图像)转换为可用于机器学习的数字特征
import sklearn.feature_extraction
字典特征提取 DictVectorizer
它是一个转换器,应用时需要进行实例化
API
sklearn.feature_extraction.DictVectorizer(sparse=True,…)
- DictVectorizer.fit_transform(X)
- X:字典或者包含字典的迭代器
- 返回 sparse 矩阵或 array 数组
- DictVectorizer.inverse_transform(X)
- X:array 数组或者 sparse 矩阵
- 返回转换之前数据格式
- DictVectorizer.get_feature_names()