特征预处理,K-紧邻API

特征工程,特征预处理

就是通过一些转换函数将特征数据转换成更加适合算法模型的特征数据过程
特征的单位或者大小相差较大,或者某特征的方差比其他特征要打出几个数量级,
容易影响(支配的结果),使得一些算法无法学习到其他的特征

特征预处理API

from sklearn import datasets#引入数据集,sklearn包含众多数据集
from sklearn.datasets.samples_generator import make_classification
iris=datasets.load_iris()#引入iris鸢尾花数据,iris数据包含4个特征变量
#构造的各种参数可以根据自己需要调整
X,y=datasets.make_regression(n_samples=100,n_features=1,n_targets=1,noise=1)
X,y=make_classification(n_samples=300,n_features=2,n_redundant=0,n_informative=2,random_state=22,n_clusters_per_class=1,scale=100)

#**引入数据**
load_data=datasets.load_boston()
data_X=load_data.data
data_y=load_data.target
print(data_X.shape)
#(506, 13)data_X共13个特征变量


from sklearn.model_selection import train_test_split#将数据分为测试集和训练集
X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3)#利用train_test_split进行将训练集和测试集进行分开,test_size占30%

from sklearn.neighbors import KNeighborsClassifier#利用邻近点方式训练数据
knn=KNeighborsClassifier()#引入训练方法
knn.fit(X_train,y_train)#进行填充测试数据进行训练

from sklearn.linear_model import LinearRegression#引入线性回归模型
###训练数据###
model=LinearRegression()
model.fit(data_X,data_y)#进行训练
model.predict(data_X[:4,:])#预测前4个数据

from sklearn.model_selection import cross_val_score#引入交叉验证
###设置n_neighbors的值为1到30,通过绘图来看训练分数###
k_range=range(1,31)
k_score=[]
for k in k_range:
    knn=KNeighborsClassifier(n_neighbors=k)
    scores=cross_val_score(knn,X,y,cv=10,scoring='accuracy')#for classfication
    k_score.append(loss.mean())



###利用minmax方式对数据进行规范化###
X=preprocessing.minmax_scale(X)#feature_range=(-1,1)可设置重置范围
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3)

# 特征工程:标准化
transfer = StandardScaler()#进行标准化
x_train = transfer.fit_transform(x_train)#进行测试集训练

1.Sklearn简介:

对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。当我们面临机器学习问题时,便可根据下图来选择相应的方法。Sklearn具有以下特点:

简单高效的数据挖掘和数据分析工具
让每个人能够在复杂环境中重复使用
建立NumPy、Scipy、MatPlotLib之上

Sklearn datasets中我们会介绍如何构造数据。然后选择
相应机器学习方法进行训练,训练过程中可以通过一些
技巧调整参数,使得学习准确率更高

from sklearn import datasets#引入数据集,sklearn包含众多数据集
from sklearn.model_selection import train_test_split#将数据分为测试集和训练集
from sklearn.neighbors import KNeighborsClassifier#利用邻近点方式训练数据

###引入数据###
iris=datasets.load_iris()#引入iris鸢尾花数据,iris数据包含4个特征变量
iris_X=iris.data#特征变量
iris_y=iris.target#目标值
X_train,X_test,y_train,y_test=train_test_split(iris_X,iris_y,test_size=0.3)#利用train_test_split进行将训练集和测试集进行分开,test_size占30%
print(y_train)#我们看到训练数据的特征值分为3类
'''
[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]
 '''

###训练数据###
knn=KNeighborsClassifier()#引入训练方法
knn.fit(X_train,y_train)#进行填充测试数据进行训练

###预测数据###
print(knn.predict(X_test))#预测特征值
'''
[1 1 1 0 2 2 1 1 1 0 0 0 2 2 0 1 2 2 0 1 0 0 0 0 0 0 2 1 0 0 0 1 0 2 0 2 0
 1 2 1 0 0 1 0 2]
'''
print(y_test)#真实特征值
'''
[1 1 1 0 1 2 1 1 1 0 0 0 2 2 0 1 2 2 0 1 0 0 0 0 0 0 2 1 0 0 0 1 0 2 0 2 0
 1 2 1 0 0 1 0 2]
'''

代码例子

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split#将数据分为测试集和训练
from sklearn.preprocessing import StandardScaler#进行标准化
from sklearn.neighbors import KNeighborsClassifier#利用邻近带点

    先从sklearn当中获取数据集,然后进行数据集的分割

# 1.获取数据集
iris = load_iris()

# 2.数据基本处理
# x_train,x_test,y_train,y_test为训练集特征值、测试集特征值、训练集目标值、测试集目标值
x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=22)

    进行数据标准化
        特征值的标准化

# 3、特征工程:标准化
transfer = StandardScaler()#进行标准化
x_train = transfer.fit_transform(x_train)#进行测试集训练
x_test = transfer.transform(x_test)

    模型进行训练预测

# 4、机器学习(模型训练)
estimator = KNeighborsClassifier(n_neighbors=9)利用邻近点方式训练集
estimator.fit(x_train, y_train)
# 5、模型评估
# 方法1:比对真实值和预测值
y_predict = estimator.predict(x_test)
print("预测结果为:\n", y_predict)
print("比对真实值和预测值:\n", y_predict == y_test)
# 方法2:直接计算准确率
score = estimator.score(x_test, y_test)
print("准确率为:\n", score)

sklearn.preprocessing

归一化

通过对原始数据进行变换把数据映射到(默认为【0,1】之间)

 API:
    sklearn.preprocessing.MinMaxScaler (feature_range=(0,1))
        MinMaxScalar.fit_transform(X)
            X:numpy array格式的数据[n_samples,n_features]
        返回值:转换后的形状相同的array

再识k - 近邻算法API

sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')

    n_neighbors:
        int,可选(默认= 5),k_neighbors查询默认使用的邻居数
    algorithm:{‘auto’,‘ball_tree’,‘kd_tree’,‘brute’}
        快速k近邻搜索算法,默认参数为auto,可以理解为算法自己决定合适的搜索算法。除此之外,
        用户也可以自己指定搜索算法ball_tree、kd_tree、brute方法进行搜索,
            brute是蛮力搜索,也就是线性扫描,当训练集很大时,计算非常耗时。
            kd_tree,构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数
            据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。
            ball tree是为了克服kd树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。

K值的选择

k值过小
容易受到异常值的影响
K值的减小就意味着整体模型变得复杂,容易发生过拟合;
k值过大
受到样本均值的问题
与输入实例较远(不相似的)训练实例也会对预测器作用,使预测发生错误。
且K值的增大就意味着整体的模型变得简单。
容易欠拟合
kd树
实现k近邻算法时,主要考虑的问题是如何对训练数据进行快速k近邻搜索。
k近邻法最简单的实现是线性扫描(穷举搜索),即要计算输入实例与每一个训练实例的距离。计算并存储好以后,再查找K近邻。当训练集很大时,计算非常耗时。

为了提高kNN搜索的效率,可以考虑使用特殊的结构存储训练数据,以减小计算距离的次数。

交叉验证,网格搜索

交叉验证:将拿到的训练数据,分为训练和验证集。以下图为例:将数据分成4份,其中一份作为验证集。然后经过4次(组)的测试,每次都更换不同的验证集。即得到4组模型的结果,取平均值作为最终结果。又称4折交叉验证。

什么是网格搜索(Grid Search)

有很多参数是需要手动指定的(如k-近邻算法中的K值),这种叫超参数。但是手动过程繁杂,所以需要对模型预设几种超参数组合。每组超参数都采用交叉验证来进行评估。最后选出最优参数组合建立模型。

交叉验证,网格搜索(模型选择与调优)API:

sklearn.model_selection.GridSearchCV(estimator, param_grid=None,cv=None)

    对估计器的指定参数值进行详尽搜索
    estimator:估计器对象
    param_grid:估计器参数(dict){“n_neighbors”:[1,3,5]}
    cv:指定几折交叉验证
    fit:输入训练数据
    score:准确率
    结果分析:
        bestscore__:在交叉验证中验证的最好结果
        bestestimator:最好的参数模型
        cvresults:每次交叉验证后的验证集准确率结果和训练集准确率结果

from sklearn import datasets#引入数据集
from sklearn.model_selection import train_test_split#将数据分为测试集和训练集
from sklearn.preprocessing import StandardScaler#标准化
from sklearn.neighbors import KNeighborsClassifier##利用邻近点方式训练数据
from sklearn.model_selection import GridSearchCV#网络搜索
iris = datasets.load_iris()#数据集的
x_train ,x_test , y_train , y_test = train_test_split(iris.data,iris.target,random_state = 22)
#target:所要划分的样本结果
# random_state:是随机数的种子。
# 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,
# 保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。

#特征工程:标准化
#实例转化一个转换器类
# 标准化数据,保证每个维度的特征数据方差为1,均值为0,
# 使得预测结果不会被某些维度过大的特征值而主导

transfer = StandardScaler()#标准化
#调用fit_transform
# fit_transform()先拟合数据,再标准化
x_train = transfer.fit_transform(x_train)

# transform()数据标准化
x_test = transfer.transform(x_test)


#KNN预估器流程
#实例化预估器类
#利用邻近点方式训练数据
estimator = KNeighborsClassifier()

#模型选择与优化--网络搜索和交叉验证
#准备要调的超参数
param_dict = {"n_neighbors":[1,3,5]}

estimator = GridSearchCV(estimator,param_grid = param_dict ,cv =3)
#estimator:scikit-learn分类器接口。需要评分机制score()或者scoring参数设置;
#param_grid:参数名称(字符串)作为键的字典以及用作值的参数设置列表(或这样的字典的列表),可以搜索任何参数设置序列;

# fit数据进行训练
estimator.fit(x_train,y_train)
#评估模型的效果
#比对预测结果和真实值
y_predict = estimator.predict(x_test)
print("比对预测结果和真实值:\n",y_predict == y_test)
score = estimator.score(x_test,y_test)
print("直接计算准确率\n",score)

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