ML、DL学习记录1
ML 、sklearn
# coding: utf-8
# Date:2020/8/12 19:22
# @Author: hcf
# @Name: toy
import os
import numpy as np
import pandas as pd
import sklearn
# scikit-learn 包
# 准确度分数
from sklearn.metrics import accuracy_score
# 对标签 进行 编码 的预处理操作
from sklearn.preprocessing import LabelEncoder
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
# 交叉验证, 找较好的超参数
from sklearn.model_selection import GridSearchCV
# Node:有的版本把 joblab 删掉了,可能需要自己使用pip install joblib进行安装
from sklearn.externals import joblib
# 随机森林
from sklearn.ensemble import RandomForestClassifier
### 逻辑回归、朴素贝叶斯、SVM
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import BernoulliNB,MultinomialNB
from sklearn.svm import SVC
## 经典的数据集合
# ML : Iris
# uci:数据集
# DL : MNIST , IMDB
# GNN: Cora
# ML: scikit-learn
def forset0():
data = pd.read_csv('iris.data',header=None)
# print(data)
x = data[np.arange(4)]
y = data[4]
print(x)
# 编码器 将字符串转换为 数字 for example: 好、还好、不好 == 0 1 2
le = LabelEncoder()
# fit 转换操作 对因子编码
le.fit(y)
# 转换
result = le.transform(y)
print(y)
print(result)
coding = [0,1,2,2,1,0]
# 逆转
inv_coding = le.inverse_transform(coding)
print(inv_coding)
# 随机森林
# 决策树的数目、分割标准(:gini、entropy)、决策树最大深度、分割节点最小的样本数目(最小为2,默认也为2)
# 叶子节点最少要多少样本
model = RandomForestClassifier(n_estimators=20,criterion='gini',max_depth=5,min_samples_split=5,
min_samples_leaf=3)
model.fit(x,result)
def forset1():
# 数据读取
data = pd.read_csv('iris.data',header=None)
# print(data)
x = data[np.arange(4)]
x = x[[2,3]]
y = LabelEncoder().fit_transform(data[4])
# 随机森林
# 决策树的数目、分割标准(:gini、entropy)、决策树最大深度、分割节点最小的样本数目(最小为2,默认也为2)
# 叶子节点最少要多少样本、随机的种子
x_train,x_test,y_train,y_test = train_test_split(x,y)
model = RandomForestClassifier(n_estimators=20, criterion='gini', max_depth=5, min_samples_split=5, min_samples_leaf=3,random_state=2020)
model.fit(x_train,y_train)
y_pred = model.predict(x)
# print('real :', y)
# print('model predit : ',y_pred)
result = y == y_pred
print(result)
# True 的数目、False的数目
print(pd.value_counts(result))
# 正确率
print(np.mean(result))
# 特征(属性)重要度, 有的时候将不重要的属性去掉 可能提高准确度
fea_importance = model.feature_importances_
print(fea_importance)
# 分类概率 [样本数,类数目]
print(model.predict_proba(x))
# 大多数模型的输出是概率,但是KNN,SVM之类的输出不是概率
# 存在随机性质: 模型、数据
#
# 数据划分 :train 和 test
# 准确率
def forset2():
data = pd.read_csv('iris.data',header=None)
# print(data)
x = data[np.arange(4)]
x = x[[2,3]]
y = LabelEncoder().fit_transform(data[4])
# 划分训练集、测试集
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.3)
# 随机森林
# 决策树的数目、分割标准(:gini、entropy)、决策树最大深度、分割节点最小的样本数目(最小为2,默认也为2)
# 叶子节点最少要多少样本、随机的种子
model = RandomForestClassifier(n_estimators=20, criterion='gini', max_depth=5, min_samples_split=5, min_samples_leaf=3,random_state=2020)
model.fit(x_train, y_train)
y_train_pred = model.predict(x_train)
y_test_pred = model.predict(x_test)
# 准确度
print('Train : ', accuracy_score(y_train,y_train_pred))
print('Test : ', accuracy_score(y_test, y_test_pred))
# 数据划分 :train 和 test
# 交叉验证
# 保存模型
def forset3():
data = pd.read_csv('iris.data',header=None)
# print(data)
x = data[np.arange(4)]
# 经过之前步骤 查看属性重要度后发现第2、3属性两个重要一些 所以单独提出来训练模型
x = x[[2,3]]
# 用于编码
y = LabelEncoder().fit_transform(data[4])
# 划分训练集、测试集 30%的分为测试集合( train:test == 7:3)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
if os.path.exists('rf.model'):
print('模型加载...')
model = joblib.load('rf.model')
else:
print('模型Train...')
# 随机森林
# 决策树的数目、分割标准(:gini、entropy)、决策树最大深度、分割节点最小的样本数目(最小为2,默认也为2)
# 叶子节点最少要多少样本、随机的种子
rf = RandomForestClassifier(n_estimators=20, criterion='gini', max_depth=5, min_samples_split=5, min_samples_leaf=3,random_state=2020)
# rf : 模型
# cv : 3折交叉验证
model = GridSearchCV(rf, cv=3,
param_grid={'max_depth':np.arange(3,7),
'min_samples_split': np.arange(2,9,2),
'min_samples_leaf':np.arange(1,5)})
model.fit(x_train, y_train)
print("最优参数:",model.best_params_)
print("最优模型:", model.best_estimator_)
print("最优分数:", model.best_score_)
y_train_pred = model.predict(x_train)
y_test_pred = model.predict(x_test)
# 准确度
print('Train : ', accuracy_score(y_train,y_train_pred))
print('Test : ', accuracy_score(y_test, y_test_pred))
# 保存模型
joblib.dump(model, 'rf.model')
# 数据划分 :train 和 test
# 交叉验证
# 保存模型
def forset3():
data = pd.read_csv('iris.data',header=None)
# print(data)
x = data[np.arange(4)]
x = x[[2,3]]
y = LabelEncoder().fit_transform(data[4])
# 划分训练集、测试集
x_train,x_test,y_train,y_test = train_test_split(x, y, test_size=0.3)
if os.path.exists('rf.model'):
print('模型加载...')
model = joblib.load('rf.model')
else:
print('模型Train...')
# 随机森林
# 决策树的数目、分割标准(:gini、entropy)、决策树最大深度、分割节点最小的样本数目(最小为2,默认也为2)
# 叶子节点最少要多少样本、随机的种子
# 当想要使用其他的模型的时候, 只需要换掉下面这一句(就是说:所有的sklearn的模型的操作都是一样的流程)
rf = RandomForestClassifier(n_estimators=20, criterion='gini', max_depth=5, min_samples_split=5, min_samples_leaf=3,random_state=2020)
# rf : 模型
# cv : 3折交叉验证
model = GridSearchCV(rf, cv=3,
param_grid={'max_depth':np.arange(3,7),
'min_samples_split': np.arange(2,9,2),
'min_samples_leaf':np.arange(1,5)})
model.fit(x_train, y_train)
print("最优参数:",model.best_params_)
print("最优模型:", model.best_estimator_)
print("最优模型:", model.best_score_)
y_train_pred = model.predict(x_train)
y_test_pred = model.predict(x_test)
# 准确度
print('Train : ', accuracy_score(y_train,y_train_pred))
print('Test : ', accuracy_score(y_test, y_test_pred))
# 保存模型
joblib.dump(model, 'rf.model')
if __name__ == '__main__':
forset3()
Tensorflow2.2.0安装问题
原因是:tensorflow的底层是c++,系统缺少了microsotf vc++组件,百度下载“微软常用运行库合集”并安装,就不会报错了