【机器学习】鸢尾花分类问题

鸢尾鸢尾花分类问题是机器学习中最简单的问题,如果这个问题有了很好的理解,机器学习就可以入门了花分类问题是机器学习中最简单的问题,如果这个问题有了很好的理解,机器学习就可以入门了。本文将利用sklearn库来解决鸢尾花分类问题。

导入数据集

#导入sklearn的数据集  
import sklearn.datasets as sk_datasets  
iris = sk_datasets.load_iris()  
iris_X = iris.data   #导入数据  
iris_y = iris.target #导入标签  
  
利用Python内置函数dir()查看数据集对象的属性:  

from sklearn.datasets import load_iris  
iris = load_iris()
print(dir(iris))

数据预处理

 与普通的数据挖掘不同,机器学习的数据还需要进行数据标准化,包括与样本尺度归一化正则化等;此外还要根据数据特征进行特征二值化one-hot编码等操作,这些工作简单可复制,经过数据预处理的数据能够更好地帮助我们进行特征处理。当我们拿到一批原始的数据时,需要思考以下问题:对连续的数值型特征进行标准化,使得均值为0,方差为1。对类别型的特征进行one-hot编码。将需要转换成类别型数据的连续型数据进行二值化。为防止过拟合或者其他原因,选择是否要将数据进行正则化。检查有没有缺失值,对缺失的特征选择恰当方式进行弥补,使数据完整。

 from sklearn import preprocessing
  
#使用preproccessing库的MinMaxScaler类对数据进行区间缩放的代码如下 
(区间缩放,基于最大最小值,将数据转换到0,1区间) 

from sklearn.preprocessing import MinMaxScaler  
scaler = MinMaxScaler(feature_range=(0,1))  #数据转换的范围是[0,1],scaler代表min和max
iris_X = scaler.fit_transform(iris_X)  #先拟合数据,然后转化它将其转化为标准形式
  
#使用preproccessing库的StandardScaler类对数据进行标准化的代码如下
(使用均值与方差,对服从正态分布的数据处理,得到符合标准正态分布的数据)

from sklearn.preprocessing import StandardScaler  
#标准化,返回值为标准化后的数据  
StandardScaler().fit_transform(iris.data)  

 #使用preproccessing库的Normalizer类对数据进行归一化的代码如下 
(将样本的特征值转换到同一量纲下) 
from sklearn.preprocessing import Normalizer  
#归一化,返回值为归一化后的数据  
Normalizer().fit_transform(iris.data)  
  
#使用preproccessing库的Binarizer类对数据进行二值化的代码如下
(设定一个阈值,大于阈值的赋值为1,小于等于阈值的赋值为0 )
from sklearn.preprocessing import Binarizer  
#二值化,阈值设置为3,返回值为二值化后的数据  
Binarizer(threshold=3).fit_transform(iris.data) 

 #使用preproccessing库的OneHotEncoder类对数据进行one-hot编码的代码如下
(将一个无序的类别变量k个值就转换成k个虚拟变量)  
from sklearn.preprocessing import OneHotEncoder  
#对IRIS数据集的目标值进行one-hot编码  
OneHotEncoder().fit_transform(iris.target.reshape((-1,1))) 

#用preproccessing库的Imputer类对数据进行缺失值计算的代码如下:  
from numpy import vstack, array, nan  
from sklearn.preprocessing import Imputer  
#缺失值计算,返回值为计算缺失值后的数据  
#参数missing_value为缺失值的表示形式,默认为NaN  
#对数据集新增一个样本,4个特征均赋值为NaN,表示数据缺失  
#参数strategy为缺失值填充方式,默认为mean(均值)  
Imputer().fit_transform(vstack((array([nan, nan, nan, nan]), iris.data)))  

#在预处理阶段,还需要对数据集进行划分,包括用来训练模型的训练集、以及测试时所使用的测试集。sklearn中的model_selection为我们提供了划分数据集的方法
  
import sklearn.model_selection as sk_model_selection  
X_train,X_test,y_train,y_test = sk_model_selection.train_test_split(iris_X,iris_y,train_size=1/3,random_state=0)  

  


 模型训练

(1)导入模型。调用逻辑回归LogisticRegression()函数。

 (2) fit()训练。调用fit(x,y)的方法来训练模型,其中x为数据的属性,y为所属类型。

 (3) predict()预测。利用训练得到的模型对数据集进行预测,返回预测结果。

#导入模型  
from sklearn.model_selection import train_test_split  
from sklearn.linear_model import LogisticRegression  
#fit()训练  
lr = LogisticRegression()  
lr.fit(X_train,y_train)  
#predict  
result = lr.predict(X_test)  
print('预测的结果',result)  
print('实际的结果',y_test)  

模型评估

#导入模型  
from sklearn.model_selection import train_test_split  
from sklearn.linear_model import LogisticRegression  
#fit()训练  
lr = LogisticRegression()  
lr.fit(X_train,y_train)  
#predict  
result = lr.predict(X_test)  
print('预测的结果',result)  
print('实际的结果',y_test)  

#查看默认参数  
#默认参数  
params=lr.get_params()  
print(params)  
  
#查看模型评分  
#模型评分 准确率  
s1 = lr.score(X_train,y_train)  
s2 = lr.score(X_test,y_test)  
print('在训练集上的准确度评分',s1)  
print('在测试集上的准确度评分',s2)  

#交叉验证  
#(模型泛化能力进行评估的方法,交叉验证既可以解决数据集的数据量不够大问题,也可以解决参数调优的问
#题)
#sklearn中提供了cross_val_score进行交叉验证,而ShuffleSplit则用来划分数据集的  
X=iris_X  #数据
y=iris_y   #预测数据
from sklearn.model_selection import cross_val_score  
from sklearn.model_selection import ShuffleSplit  
cv_split = ShuffleSplit(n_splits=5, train_size=0.7, test_size=0.2)  #设置随即拆分个数为5
score_ndarray = cross_val_score(logisticRegression_model, X, y, cv=cv_split)  
print(score_ndarray)  #输出评分
score_ndarray.mean()  #平均分

#预测结果  
#预测为某个类型的概率  
result = lr.predict_proba(x_test)  

你可能感兴趣的:(分类,sklearn,python)