基于sklearn

1.Sklearn简介
sklearn (全称 Scikit-Learn) 是基于 Python 语言的机器学习工具,Sklea是处理机器学习 (有监督学习和无监督学习) 的包。它建立在 NumPy, SciPy, Pandas 和 Matplotlib 之上,其主要集成了数据预处理、数据特征选择,sklearn有六个任务模块和一个数据引入模块:

有监督学习的分类任务
有监督学习的回归任务
无监督学习的聚类任务
无监督学习的降维任务
数据预处理任务
模型选择任务
数据引入
具体流程如下:
下载 sklearn。

// 已经下载过Anaconda

conda install scikit-learn

2.Sklearn数据
2.1 数据格式
在 Sklean 里,模型能即用的数据有两种形式:

Numpy 二维数组 (ndarray) 的稠密数据 (dense data),通常都是这种格式。
SciPy 矩阵 (scipy.sparse.matrix) 的稀疏数据 (sparse data),比如文本分析每个单词 (字典有 100000 个词) 做独热编码得到矩阵有很多 0,这时用 ndarray 就不合适了,太耗内存。
上述数据在机器学习中通常用符号 X 表示,是模型自变量。它的大小 = [样本数, 特征数],有监督学习除了需要特征 X 还需要标签 y,而 y 通常就是 Numpy 一维数组,无监督学习没有 y。
2.2 自带数据集

引入数据集的方法:

获取小数据:load_dataname
获取大数据:fetch_dataname
构造随机数据:make_dataname
Load一个数字小数据集 digits

digits=datasets.load_digits()
digits.keys()

Fetch 一个加州房屋大数据集 california_housing

housing=datasets.fetch_california_housing()
housing.keys()

Make 一个高斯分位数数据集 gaussian_quantile

gaussian=datasets.make_gaussian_quantiles()
type(gaussian),len(gaussian)

引入数据集的两种代码:

from sklearn import datasets
#使用数据集时,以鸢尾花数据集为例
iris=datasets.load_iris()

from sklearn.datasets import load_iris
#使用数据集时,以鸢尾花数据集为例
iris=load_iris()
iris.keys()
#结果
dict_keys(['data', 'target', 'frame', 'target_names', 'DESCR', 'feature_names', 'filename'])

键里面的名称解释如下:

data:特征值 (数组)

target:标签值 (数组)

target_names:标签 (列表)

DESCR:数据集描述

feature_names:特征 (列表)

filename:iris.csv 文件路径


将数据集转换为DataFram:

import pandas as pd
iris_data=pd.DataFrame(iris.data,
columns=iris.feature_names)
iris_data['species']=iris.target_names[iris.target]
iris_data.head(3).append(iris_data.tail(3))

可视化seaborn

import seaborn as sns
sns.pairplot(iris_data,hue='species',palette='husl')


3.核心API
三大API:
1.估计器(estimator) :拟合器(fitter)可把它当成一个模型 (用来回归、分类、聚类、降维)。
2. 预测器 (predictor) 是具有预测功能的估计器
3.转换器 (transformer) 是具有转换功能的估计器

3.1 估计器
定义:任何可以基于数据集对一些参数进行估计的对象都被称为估计器
拟合估计器:在有监督学习中的代码范式为

model.fit( X_train, y_train )

在无监督学习中的代码范式为

model.fit( X_train )

拟合之后可以访问 model 里学到的参数,比如线性回归里的特征前的系数 coef_,或 K 均值里聚类标签 labels_。

model.coef_
model.labels_

线性回归

from sklearn.linear_model import LinearRegression
model=LinearRegression(normalize=True)
model

创建一个简单的数据集

import matplotlib.pyplot as plt
x=np.arange(10)
y=2*x+1
plt.plot(x,y,'o')
X=x[:,np.newaxis] #Sklearn 里模型要求特征 X 是个两维变量么 (样本数×特征数),但在本例中 X 是一维,因为我们用 np.newaxis 加一个维度,就是把一维 [1, 2, 3] 转成 [[1],[2],[3]]
model.fit(X,y)
print(model.coef_)
print(model.intercept_)


K均值

from sklearn.cluster import KMeans
model=KMeans(n_clusters=3)
X=iris.data[:,0:2]
model.fit(X)
print(model.cluster_centers_,'\n')
print(model.labels_,'\n')
print(model.inertia_,'\n')
print(iris.target)

解释一下 KMeans 模型这几个参数:
model.cluster_centers_:簇中心。三个簇那么有三个坐标。

model.labels_:聚类后的标签

model.inertia_:所有点到对应的簇中心的距离平方和 (越小越好)

左图是根据聚类得到的标签画出散点图,而右图是根据真实标签画出散点图,对比两幅图看很像,聚类的效果还不错。

from matplotlib.colors import ListedColormap
cmap_light=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold1=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
cmap_bold2=ListedColormap(['#FFAAAA','#AAFFAA','#AAAAFF'])
centroid=model.cluster_centers_
label=iris.target
true_centroid=np.vstack((X[label==0,:].mean(axis=0),
X[label==1,:].mean(axis=0),
X[label==2,:].mean(axis=0)))
plt.figure(figsize=(12,6))

plt.subplot(1,2,1)
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap=cmap_bold1)
plt.scatter(centroid[:,0],centroid[:,1],marker='o',s=200,
edgecolors='k',c=[0,1,2],cmap=cmap_light)
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.title('Cluster class')

plt.subplot(1,2,2)
plt.scatter(X[:,0],X[:,1],c=model.labels_,cmap=cmap_bold2)
plt.scatter(centroid[:,0],centroid[:,1],marker='o',s=200,
edgecolors='k',c=[0,1,2],cmap=cmap_light)
plt.xlabel('sepal length')
plt.ylabel('sepal width')
plt.title('Cluster class')
plt.show()

 


3.2 预测器
最常见的就是 predict() 函数:

model.predict(X_test):评估模型在新数据上的表现
model.predict(X_train):确认模型在老数据上的表现
做预测之前,将数据分为8:2的的训练集 (X_train, y_train) 和测试集 (X_test, y_test),用从训练集上拟合 fit() 的模型在测试集上预测 predict()。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
iris=load_iris()
x_train,x_text,y_train,y_test=train_test_split(iris['data'],iris['target'],
test_size=0.2)
print(x_train.shape)
print(y_train.shape)
print(x_text.shape)
print(y_test.shape)

监督学习的对率回顾。

from sklearn.linear_model import LogisticRegression
model=LogisticRegression(solver='lbfgs',multi_class='multinomial')
model.fit(x_train,y_train)
y_pred=model.predict(x_text)
p_pred=model.predict_proba(x_text)
print(y_test,'\n')
print(y_pred,'\n')
print(p_pred,'\n')

其中predict & predict_proba,前者是预测的类别,后者是只预测的准确度

预测器里还有额外的两个函数可以使用。在分类问题中

score() 返回的是分类准确率
decision_function() 返回的是每个样例在每个类下的分数值
监督学习的K均值。
from sklearn.cluster import KMeans
model=KMeans(n_clusters=3)
model.fit(x_train[:,0:2])
pred=model.predict(x_text[:,0:2])
print(pred)
print(y_test)
model.score(x_text[:,0:2])

以上例子是以有监督学习的 LinearRegression 和无监督学习的 KMeans 举例,在实际应用时可以替换成其他模型。使用的通用伪代码如下
有监督学习。

#有监督学习
from sklearn.xxx import SomeModel
#xxx 可以是 linear_model 或 ensemble 等
model = SomeModel( hyperparameter )
model.fit( X, y )
y_pred = model.predict( X_new )
s = model.score( X_new )

无监督学习。

from sklearn.xxx import SomeModel
# xxx 可以是 cluster 或 decomposition 等
model = SomeModel( hyperparameter )
model.fit( X )
idx_pred = model.predict( X_new )
s = model.score( X_new )

posted @   stdrush  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示