питон: sklearn

машинное обучение
питон: sklearn

что такое склерн

sklearn是python的pypi中的一个第三方库。
里面有很多模型算法可以直接调用。

机器学习的开发基本分为6个步骤,
1)获取数据
2)数据处理
3)特征工程
4)机器学习的模型训练,模型保存和加载
5)模型评估
6)模型应用

1/ Получить данные

sklearn这个包中,有自带的一些数据集,sklearn为初学者提供的数据集都在datasets这个目录下。
sklearn中获取数据集使用的包为sklearn.datasets
之后可以接load_* 和fetch_*从sklearn为初学者提供的数据集中获取数据。
其中,load_*获取的是小规模的数据集,fetch_*获取的是大规模的数据集。
   # 获得小规模数据
   from sklearn.datasets import load_iris 
   iris_object = load_iris() # 获取小规模的数据

   #获取数据之后,可以查看数据的一些属性,例如:
   iris_object.data  # 得到的是特征的数据(不包括标签列),格式为[[],[],[],[]]
   iris_object.data.shape # 得到的是特征数据的行列,几行几列

   iris_object.target # 得到的是标签这一列的数据,格式为[x,x,x,......]

   iris_object.DESCR #数据描述
   iris_object.feature_names # 特征名称
   iris_object.target_names  # 标签的名称
   
   # 获得大规模数据
   from sklearn.datasets import fetch_20newsgroups
   news = fetch_20newsgroups() # 获取大规模的数据

2/обработка данных

获取后的数据还不能直接使用,需要划分为训练数据集和测试数据集
sklearn中提供了划分数据集的函数,
sklearn.model_selection.train_test_split(x,y,test_size,random_seed)

有4个参数:
   <1>x是数据集的特征值
   <2>y是数据集的目标值
   <3>test_size测试集的大小,为float类型,
      比如test_size=0.2,则表示训练数据集占80%,测试数据集占20%
   <4>random_state随机数种子,不同的随机数种子会产生不同的随机采样结果,
      如果想复现,则每次都用一样的random_state
返回值的按照顺序为:训练集特征值,测试集特征值,训练集目标值,测试集目标值
   # 例如
   from sklearn.model_selection import train_test_split
   x_train,x_test,y_train,y_test = train_test_split(iris_object.data,
                                                    iris_object.target,
                                                    test_size-0.2,
                                                    random_state=22)

3/ Особенности разработки

  pandas:一个非常方便的读取数据并进行基本的处理的工具
  sklearn:提供了很强大的特征处理的接口

1/Извлечение признаков

①Извлечение функций словаря:

  Sklearn.feature_extraction.DictVectorizer
  DictVectorizer.fit_transform()
  输入值为字典或者包含字典的迭代器
  返回值为sparse矩阵,可以使用False改变返回值的类型为二维数组
  DictVectorizer.inverse_transform()
  输入值为数组或者sparse矩阵
  返回值为转换之前的数据格式
  DictVectorizer.get_feature_names()  
  返回值为类别的名称

  应用的场景:1.类别较多,将数据集的特征转化为字典类型,再利用DictVectorizer进行转换
            2.拿到的是字典类型的数据

②Извлечение текстовых функций

    Sklearn.feature_extraction.text.CountVectorizer(stop_words[])
      
      stop_words:停用词,指的是指定的词不在做为文本特征提取的处理对象
      CountVectorizer.transfer.fit_transform()
      输入值为文本字典或者包含文本字符串的迭代器
      返回值为sparse矩阵,sparse矩阵使用toarray方法可以直接转换为二维数组
      CountVectorizer.inverse_transform()
      输入值为数组或者sparse矩阵
      返回值为转换之前的数据格式
      CountVectorizer.get_feature_names

      返回值为类别的名称

    中文分词可以使用jieba库,实现字符串的转换分词。

    TFIDF文本特征抽取,利用词在一个文章中使用频率与别的文章有很大区别,来实现特征的提取。

    TFIDF文本特征提取的方法:Sklearn.feature_extraction.text.TfidfVectorizer(stop_words[])

      TfidfVectorizer.transfer.fit_transform()

      输入值为文本字典或者包含文本字符串的迭代器

      返回值为sparse矩阵,sparse矩阵使用toarray方法可以直接转换为二维数组

      TfidfVectorizer.inverse_transform()

      输入值为数组或者sparse矩阵

      返回值为转换之前的数据格式

      TfidfVectorizer.get_feature_names

      返回值为类别的名称

2/Функция предварительной обработки

① Нормализация

  sklearn.preprocessing.MinMaxScaler(feature_range=(0,1)....)

  feature_range=(0,1) 数据处理后的范围
  MinMaxScaler.fit_traensform()
  输入值为numpy array格式的数据[n_samples,n_features]   [样本数,特征数]         
  返回值为形状相同的array
  缺点:这种方式会受到异常值的很大的影响。

②Стандартизация:

  sklearn.preprocessing.StandardScaler
    
  不用指定范围会直接将数据处理到(0,1)的范围内,均值为0,标准差为1
  StandardScaler.fit_traensform()
  输入值为numpy array格式的数据[n_samples,n_features]   [样本数,特征数]         
  返回值为形状相同的array
  标准化的方法比较适合大数据的处理,在样本足够多的情况下比较稳定。

3/Уменьшение размерности признаков:

  指的是降低特征的个数,除去不相关的特征。

①Уменьшение размерности фильтрации дисперсии:

  sklearn.feature_selection.VarianceThreshold(threshold=0.0)
  VarianceThreshold.fit_transform()
  输入值为numpy array格式的数据[n_samples,n_features]   [样本数,特征数]
  返回值为删除了低方差特征的特征后的数组 

② Уменьшение размерности фильтрации коэффициента корреляции:

  相关系数的计算方法:scipy.stats.pearsonr(x,y)
  输入值为数据的特征的名称

③ Анализ основных компонентов (АПК)

  sklearn.decomposition.PCA(n_components=None)
  将数据进行处理,实现数据的降维。
  n_components:
  小数:保留百分之多少的信息
  整数:减少到剩余多少个信息
  PCA.fit_transform()
  输入值为numpy array格式的数据[n_samples,n_features]   [样本数,特征数]
  返回值为转换之后为指定维数的数组 
          

4/ Модельное обучение (конструкторская модель)

sklearn中算法训练的基本使用:
1.实例化一个estimator类
2.estimator调用fit()方法,对输入的x_train,y_train数据进行训练
3.模型评估:y_predict = estimator.(x_test)
          y_predict == y_test
  或:
     accuracy=estimator.score(x_test,y_test)计算出准确率

Алгоритм классификации:

① Алгоритм KNN

  sklearn.neighbors.KNeighborsClassifier(n_neighbors=5,algorithm='auto')
  n_neighbors为K值,algorithm默认为auto,一般不用设置,会选择最佳的算法
  优点:简单易于理解,易于实现
  缺点:懒惰算法,计算量大,内存的开销比较大,K值的选择不一定,需要找到最适合K值才能实现好的结果。

②Поиск по сетке и перекрестная проверка

 sklearn.model_selection.GridSearchCV(estimator,param_grid=None,cv=None)
 返回值为estiamtor对象
 estimator:预估器对象
 param_grid:预估器参数{"n_neighbors":[1,3,5,7,9]}
 cv:进行交叉验证的折数
 可使用的方法:
 .fit()输入训练数据进行训练
 .score()输出训练的准确率
 最佳参数:best_param_
 最佳结果:best_score_
 最佳预估器 :best_estimator_
 交叉验证结果:cv_results_   

③ Алгоритм наивного Байеса

 认定各个特征之间是相互独立的
 拉普拉斯平滑系数:分子加上α,分母加上mα(训练文档中特征词出现的个数,α值常为1)
 sklearn.naive_bayes.MultinomialNB(alpha=1.0)
   优点:分类效率稳定,对缺失数据不太敏感,算法也比较简单,常用于文本分类
   缺点:由于假设了特征之间的相互独立,如果所用的数据集中的特征之间存在关联,就会产生不合适的结果

④ Дерево решений:

 通过将特征进行排序,将影响更大的特征优先进行考虑,可以使用信息增益作为判定的依据    
 sklearn.tree.DecisionTreeClassifier(criterion='gini',
                                     max_depth=None,
                                     random_state=None)
  criterion:默认为'gini',用cart决策树,基尼系数作为特征选择的依据,
             也可以改为'entropy'即为信息增益,这个时候就是id3决策树了。
  max_depth:树的深度大小(可以通过改变深度大小,减小决策树的过拟合)
  random_state:随机数种子
  
  决策树的可视化:
  sklearn.tree.export_graphviz(estimator,out_file="tree.dot",feature_names)
  feature_names在输入之后才能显示在对应的位置
  优点:简单易理解,可以实现可视化
  缺点:没有设置深度,容易产生过拟合

⑤ Случайный лес:

  训练集随机:随机有放回抽样;特征随机:从M个特征中,抽取m个特征,M>>m
  sklearn.ensemble.RandomForestClassifier(n_estimator=10,
                                           criterion='gini',
                                           max_depth=None,
                                           bootstrap=True,
                                           random_state=None,
                                           min_sample_lit=2)

  max_features="auto":默认为“auto”,每个决策树的最大特征数量,即为m值得选取方法。
  if"auto",求平方根;if"sqrt",求平方根;if"log2",求log2();if None,使用M值
  {"n_estimators":[120,200,300,500,800,1200],"max_depth":[5,8,10,15,30]}
  优点:具有很好的准确率,处理高维样本很有优势

Алгоритм регрессии:

①Линейная регрессия

  将目标值和特征值当做线性关系,来实现拟合,得到回归算法。
  线性模型不等于线性关系,参数一致的非线性关系也可以称作线性模型。
  正规方程:sklearn.linear_model.LinearRegression(fit_intercept=True)
    fit_intercept:是否计算偏置
    LinearRegression.coef_:回归系数
    LinearRegression.intercept_:偏置

  梯度下降:
    sklearn.linear_model.SGDRegressor(loss="squared_loss",    
                                      fit_intercept=True,
                                      learning_rate='invscaling',
                                      eta0=0.01)
                                             
    loss:损失类型,squared_loss最小二乘法的损失函数类型
    max_iter:迭代次数
    fit_intercept:是否计算偏置
    learning_rate:string,optional(指的是步长)
    'constant':eta=eta0
    ''optional":eta=1.0/(alpha*(t+t0))[defult]
    'invscaling':eta=eta0/pow(t,power_t) power_t=0.25
    SGDRegressor.coef_:回归系数
    SGDRegressor.intercept_:偏置

  模型评估方法(均方误差评估):
  sklearn.metrics.mean_squared_error(y_true,y_pre)
                                     y_true:真实值
                                     y_pre:预测值
                                     return:浮点数结果

② Ридж Возвращение

  进行正则化处理时削弱某些特征值的作用,从而结果过拟合与欠拟合的问题。
  L1正则化:直接删除,L2正则化:削弱作用
  sklearn.linear_model.Ridge(alpha=1.0,
                             fit_intercept=True,
                             solver"auto",
                             normolize=False)
                             
  alpha:正则化力度,也叫λ取值0~1或者1~10
  solver:会根据数据集自动选择优化方法
  normalize:数据是否进标准化,如果设置为True就不用再前面进行标准化,实现效果是一样的
  Ridge.coef_:回归系数
  Ridge.intercept_:偏置
  Ridge方法相当于SGDRegressor(penalty='l2',loss="squared_loss"),但是后者缺少可SAG

③Логистическая регрессия

 sklearn.linear_model.LogisticRegression(solver="liblinear",
                                         penalty="l2",
                                         C=1.0)
 solver:优化求解方式
 penalty:正则化种类
 C:正则化力度

5/ Оценка модели (кривая ROC и показатели AUC):

sklearn.metrics.roc_auc_score(y_true,y_score)    
y_true=每个样本的真实类别,必须为0(反例),1(正例)
y_score=预测得分,可以是正例的估计概率,置信值,分类器方法的返回值
AUC只能用来评估二分类的问题,非常适合评价样本不均衡中的分类器性能

6/ Сохранение и загрузка модели: sklearn.externals.joblib

保存模型:joblib.dump(estimator,"my_ridge.pkl")
加载模型:estimator=joblib.load("my_ridge.pkl")
  
  

7) Приложение модели