数据的获取
sklearn 数据集一览
类型
|
获取方式
|
自带的小数据集
|
sklearn.datasets.load_...
|
在线下载的数据集
|
sklearn.datasets.fetch_...
|
计算机生成的数据集
|
sklearn.datasets.make_...
|
mldata.org
在线下载数据集
|
sklearn.datasets.fetch_mldata(...)
|
自带的小数据集:
鸢尾花数据集:
load_iris()
可用于分类 和 聚类
乳腺癌数据集:
load_breast_cancer()
可用于分类
手写数字数据集:
load_digits()
可用于分类
糖尿病数据集:
load_diabetes()
可用于分类
波士顿房价数据集:
load_boston()
可用于回归
体能训练数据集:
load_linnerud()
可用于回归
图像数据集:
load_sample_image(name)
计算机生成的数据集:
make_blobs
可用于聚类和分类
make_classification
可用于分类
make_circles
可用于分类
make_moons
可用于分类
make_multilabel_classification
可用于多标签分类
make_regression
可用于回归
一,自带的小数据集
▾# 导入数据
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
iris = datasets.load_iris() #鸢尾花 for classification
digits = datasets.load_digits() #手写数字识别 for classification
boston = datasets.load_boston() #波士顿房价 for regression
iris['data']
iris['target']
iris['feature_names']
iris['target_names']
二,计算机生成的数据集
# 生成数据 make_blobs
import pandas as pd
%matplotlib inline
import matplotlib
from sklearn.datasets.samples_generator import make_blobs
center=[[1,1],[-1,-1],[1,-1]]
cluster_std=0.3
▾X,labels=make_blobs(n_samples=200,centers=center,n_features=2,
cluster_std=cluster_std,random_state = 0)
print('X.shape',X.shape)
print("labels",set(labels))
df = pd.DataFrame(np.c_[X,labels],columns = ['feature1','feature2','labels'])
df['labels'] = df['labels'].astype('i2')
#mycolormap = matplotlib.colors.ListedColormap(['red','cyan','magenta'], N=3)
#matplotlib常用colormap:'jet','rainbow','hsv'
▾df.plot.scatter('feature1','feature2', s = 100,
c = list(df['labels']),cmap = 'rainbow',colorbar = False,
alpha = 0.8,title = 'dataset by make_blobs')
#生成数据集 make_classification
from sklearn.datasets.samples_generator import make_classification
▾X,labels=make_classification(n_samples=300,n_features=2,n_classes = 2,
n_redundant=0,n_informative=2,
random_state=0,n_clusters_per_class=2)
rng = np.random.RandomState(2)
X+=2*rng.uniform(size=X.shape)
df = pd.DataFrame(np.c_[X,labels],columns = ['feature1','feature2','labels'])
df['labels'] = df['labels'].astype('i2')
#mycolormap = matplotlib.colors.ListedColormap(['red','cyan','magenta'], N=3)
#matplotlib常用colormap:'jet','rainbow','hsv'
▾df.plot.scatter('feature1','feature2', s = 100,
c = list(df['labels']),cmap = 'rainbow',colorbar = False,
alpha = 0.8,title = 'dataset by make_classification')
#生成数据集 make_circles
from sklearn.datasets.samples_generator import make_circles
X,labels=make_circles(n_samples=200,noise=0.2,factor=0.2,random_state=1)
print("X.shape:",X.shape)
print("labels:",set(labels))
df = pd.DataFrame(np.c_[X,labels],columns = ['feature1','feature2','labels'])
df['labels'] = df['labels'].astype('i2')
▾df.plot.scatter('feature1','feature2', s = 100,
c = list(df['labels']),cmap = 'rainbow',colorbar = False,
alpha = 0.8,title = 'dataset by make_circles')
# 生成数据集 make_regression
from sklearn.datasets.samples_generator import make_regression
▾X,Y,coef = make_regression(n_samples=100, n_features=1, n_informative=1,
n_targets=1, bias=5, effective_rank=None,
tail_strength= 0, noise= 10, shuffle=True,
coef=True, random_state=None)
df = pd.DataFrame(np.c_[X,Y],columns = ['x','y'])
# red:'r',green:'g',blue:'b',cyan:'c',magenta:'m'
df.plot('x','y',kind = 'scatter',s = 50,c = 'm',edgecolor = 'k')
数据预处理
预处理数据包括:特征的标准化,数据的正则化,特征的二值化,非线性转换,数据特征编码,缺 失值插补,
生成多项式特征等。
数据预处理的
api
有两种接口,一种是类接口,需要先
fit
再
transform
,或者使用
fit_transform
sklearn.preprocessing.StandardScaler.fit_transform(data)。
第二种是函数接口,可以直接转换。如
sklearn.preprocessing.scale(data)
。
推荐使用类接口
一,特征的标准化
特征的标准化指的是将数据集的特征进行某种线性缩放和偏移。在许多情况下,特征的标准化可以 改善机器学习算法的性能和效率。
常见的数据标准化方式包括:
StandardScaler:
缩放至
0
均值,
1
标准差。
MinMaxScaler:
缩放至
[0,1]
之间,也可以指定范围
feature_range
。
MaxAbsScaler:
缩放至
[-1,1]
之间,无偏移。
RobustScaler
:缩放有异常值的特征。
import numpy as np
import pandas as pd
%matplotlib inline
from sklearn import datasets
from sklearn import preprocessing
boston = datasets.load_boston()
df = pd.DataFrame(data = boston.data,
columns = list(boston.feature_names))
df.plot(legend = False)
# MinMax缩放
minmaxscaler = preprocessing.MinMaxScaler(feature_range = (0,1))
minmaxscaler.fit(df.values)
data = minmaxscaler.transform(df.values)
dfscaled = pd.DataFrame(data,columns = list(boston.feature_names))
dfscaled.plot(legend = False)
# x为一个具有异常值的特征
x = np.array([10,1000,0,0,-30,0,20,0,10,0,0,-10])
x = x.reshape(-1,1)
# RobustScaler缩放有异常值的特征
robustscaler = preprocessing.RobustScaler(with_centering=True, with_scaling=True,
quantile_range=(25.0, 75.0), copy=True)
print(robustscaler.fit_transform(x))
# y为稀疏列矩阵
y = np.array([0]*95+[0.0,20,0,10,-10])
y = y.reshape(-1,1)
# 使用MaxAbsScaler缩放稀疏矩阵
scaler = preprocessing.MaxAbsScaler(copy=True)
z = scaler.fit_transform(y)
z[-10:]
# 使用无均值偏移的StandardScaler缩放稀疏矩阵
scaler = preprocessing.StandardScaler(with_mean=False,
with_std=True, copy=True)
z = scaler.fit_transform(y)
z[-10:]
二,数据正则化
(normalize)
正则化是缩放单个样本以具有单位范数的过程。正则化有时也叫归一化,正规化。如果你计划使用
二次形式
(
如点积或任何其他核函数
)
来量化任何样本间的相似度,则此过程将非常有用。
常用的向量范数有
"l1"
范数和
"l2"
范数
from sklearn import preprocessing
X = [[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]]
# 使用normalize函数
X_normalized = preprocessing.normalize(X, norm='l2')
print(X_normalized)
# 也可以使用Normalizer类
normalizer = preprocessing.Normalizer(norm = 'l1')
normalizer.fit(X) #fit does nothing
normalizer.transform(X)
三,特征的二值化
特征二值化是将数值特征用阈值过滤得到布尔值的过程
X = [[ 1., -1., 2.],
[ 2., 0., 0.],
[ 0., 1., -1.]]
binarizer = preprocessing.Binarizer().fit(X) # fit does nothing
binarizer
binarizer.transform(X)
# 设定一个阈值
binarizer = preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
四,分类特征编码
在机器学习中,特征经常不是数值型的而是分类型
(
标称型
)
的。举个例子,一个人的性别可能是
"male"
或
"female"
两者之一。我们可以用
0
来表示
"male",1
来表示
"female"
。但是这样做的话,性别
特征就变得有序了。
为了解决这个问题,我们可以使用一种叫做
"one-of-K"
或称做
"one-hot"
(独热)的编码方式。即两
个特征值来进行编码性别
[1,0]
表示
"male"
,而
[0,1]
表示
"female"
。通常使用
"one-hot"
方式编码后会
增加数据的维度和稀疏性
from sklearn import preprocessing
X = [[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]]
onehot = preprocessing.OneHotEncoder()
onehot.fit_transform(X).toarray() # 将稀疏矩阵转化为普通矩阵
# 如果训练集中有丢失的分类特征值,必须显式地设置 n_values
encoder = preprocessing.OneHotEncoder(n_values=[2,4,4])
encoder.fit_transform(X).toarray()
五,处理缺失值
因为各种各样的原因,真实世界中的许多数据集都包含缺失数据,这类数据经常被编码成空格、
NaN
,或者是其他的占位符。但是这样的数据集并不能和
scikit-learn
学习算法兼容。
使用不完整的数据集的一个基本策略就是舍弃掉整行或整列包含缺失值的数据。但是这样就付出了
舍弃可能有价值数据(即使是不完整的 )的代价。
处理缺失数值的一个更好的策略就是从已有的数据推断出缺失的数值。
import numpy as np
from sklearn.preprocessing import Imputer
# 策略有 mean,most_frequent,median
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
#fit求得第一列特征均值为4,第二列特征均值为11/3
X = [[np.nan, 2], [6, np.nan], [7, 6]]
print(imp.transform(X))
六,生成多项式特征
在机器学习中,通过增加一些输入数据的非线性特征来增加模型的复杂度通常是有效的。一个简单
通用的办法是使用多项式特征,这可以获得特征的更高次数和互相间关系的项。
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(6).reshape(3, 2)
poly = PolynomialFeatures(2)
print(X)
print(poly.fit_transform(X))
poly2 = PolynomialFeatures(2,interaction_only=True)
print(poly2.fit_transform(X))
正式开启机器学习之路,欢迎交流wx: jackey_love,验证:py