AI,AllenIferson
1.AI基础
1.1应用
棋类游戏
自然语言处理
专家系统
视觉系统
语音识别
手写识别
智能机器人
1.2 Python内库
Numpy
Scipy
matplotlib
nltk
SimpleAI
1.3 常见机器学习算法
1.3.1有监督
分类:决策树,随机森林,SVM(支持向量机),朴素贝叶斯,KNN
回归:逻辑回归,线性回归
1.3.2无监督
聚类:K-means
关联
1.3.3增强学习
马尔可夫决策
1.4预处理数据
import numpy as np
from sklearn import preprocessing
原始数据
input_data = np.array([[2.1, -1.9, 5.5],
[-1.5, 2.4, 3.5],
[0.5, -7.9, 5.6],
[5.9, 2.3, -5.8]])
二值化,阈值为0.5
data_binarized = preprocessing.Binarizer(threshold = 0.5).transform(input_data)
print("\nBinarized data:\n", data_binarized)
平均去除(消除特征向量均值,每个特征都以0为中心)
data_scale=preprocessing.scale(input_data)
缩放(缩放特征向量)
data_scaler_minmax=preprocessing.MinMaxScaler(feature_range=(0,1))
data_scaler_minmax=data_scaler_minmax.fit_transform(input_data)
2.分类模型
2.1 朴素贝叶斯模型有三个类型
Gaussian(高斯),Multinomial(多项式)和Bernoulli(伯努利)
import numpy as np
import sklearn
#导入数据
from sklearn.datasets import load_breast_cancer
data=load_breast_cancer()
label_name=data['target_names'] #标签
labels=data['target']
feature_names=data['feature_names'] #特征
features=data['data']
#切分数据为 训练 测试集
from sklearn.model_selection import train_test_split
train,test,train_labels,test_labels=train_test_split(features,labels,test_size=0.1,random_state=42)
#建立模型
from sklearn.naive_bayes import GaussianNB #朴素贝叶斯中的高斯分类器
gnb=GaussianNB()
model=gnb.fit(train,train_labels) #训练数据
#测试集,评估模型准确性
pred=gnb.predict(test)
#准确性比较
from sklearn.metrics import accuracy_score
print(accuracy_score(test_labels,pred))
使用模型,暂时可以通过gnb.predict函数(data数组)可得到label标签
2.2 逻辑回归
import numpy as np
import matplotlib.pylab as plt
from sklearn import linear_model
#结果可视化函数
def logistic_visualize(classifier,X,y):
#边界
min_x,max_x=X[:,0].min()-1.0,X[:,0].max()+1.0
min_y,max_y=X[:,1].min()-1.0,X[:,1].max()+1.0
step=0.02 #步长
#生成网格内全部点
X_val,y_val=np.meshgrid(np.arange(min_x,max_x,step),
np.arange(min_y,max_y,step))
output=classifier.predict(np.c_[X_val.ravel(),y_val.ravel()]) #预测
output=output.reshape(X_val.shape)
#画图
plt.figure()
plt.pcolormesh(X_val,y_val,output,cmap=plt.cm.gray)
plt.scatter(X[:,0],X[:,1],c=y,s=75,edgecolors='black',linewidths=1,cmap=plt.cm.Paired)
#指定图的边界
plt.xlim(X_val.min(), X_val.max())
plt.ylim(y_val.min(), y_val.max())
plt.xticks((np.arange(int(X[:, 0].min() - 1), int(X[:, 0].max() + 1), 1.0)))
plt.yticks((np.arange(int(X[:, 1].min() - 1), int(X[:, 1].max() + 1), 1.0)))
plt.show()
#data
X = np.array([[2, 4.8], [2.9, 4.7], [2.5, 5], [3.2, 5.5], [6, 5], [7.6, 4],
[3.2, 0.9], [2.9, 1.9],[2.4, 3.5], [0.5, 3.4], [1, 4], [0.9, 5.9]])
y = np.array([0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3])
#线性分类器中的 逻辑分类器
Classifier=linear_model.LogisticRegression(solver='liblinear',C=75)
#训练
Classifier.fit(X,y)
logistic_visualize(Classifier,X,y)
数据可视化中,用np生成点,最后用plt画出来
2.3随机森林
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_breast_cancer
cancer=load_breast_cancer()
import matplotlib.pylab as plt
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test=train_test_split(cancer.data,cancer.target,test_size=0.4,random_state=0)
#随机森林模型
forest=RandomForestClassifier(n_estimators=50,random_state=0)
forest.fit(X_train,y_train)
from sklearn.metrics import accuracy_score
print(accuracy_score(forest.predict(X_test),y_test))
#print(forest.score(X_test,y_test)) 一样的准确性结果
#结果可视化,使用plt,显示特征重要性表
n_feature=cancer.data.shape[1]
plt.barh(range(n_feature),forest.feature_importances_,align='center')
plt.yticks(np.arange(n_feature),cancer.feature_names)
plt.xlabel("Feature Importance")# x,y轴的标签
plt.ylabel("Feature")
plt.show()
使用随机森林模型的feature_importances进行可视化。
2.4分类器性能
分类性能指标,如平均准确率,AUC等
混淆矩阵
在上面的混淆矩阵中,1
表示正类,0
表示负类。
以下是与混淆矩阵相关的术语 -
- 真正 - 当实际的数据点类别为1并且预测也为1时,TP就是这种情况。
- 真负 - 当数据点的实际类别为0并且预测也为0时,TN就是这种情况。
- 假正 - 当实际的数据点类别为0并且预测也为1时,FP就是这种情况。
- 假负 - FN是数据点的实际类别为1且预测也为
0
的情况。
2.4.1准确性Accuracy
2.4.2精确Precision
被预测出来的1,有多少是对的
2.4.3召回(灵敏度)Recall
实际1中有多少被预测出来了
2.4.4特异性Specificity
实际的0多少被预测出来了
3. 回归模型
3.1线性回归
reg_linear=linear_model.LinearRegression()
#线性回归器
plt可视化
plt.scatter(X_test,y_test,color='red')
plt.plot(X_test,y_test_pred,color='black',linewidth=2)
plt.xticks(())
plt.yticks(())
plt.show()
plt.scatter(x,y,color) 散点图
plt.plot(x,y,color,linewidth)连线图
plt.xticks() x轴刻度尺
多变量回归
from sklearn.preprocessing import PolynomialFeatures
ploynomial=PolynomialFeature(degree=10)#10阶多项式
X_train_transformed=ploynomial.fit_transform(X_train)
ploy_linear_model=linear_model.LinearRegression()
ploy_linear_model.fit(X_train_transformed,y_train)
4 聚类算法
4.1K-means
1.指定K个元组的数量
2.根据集群数量对数据分类,确定质心
import matplotlib.pylab as plt
from sklearn.cluster import KMeans
import numpy as np
from sklearn.datasets._samples_generator import make_blobs
#生成四个blob的二维数据集,数量,中心个数,集群标准,随机状态
X,y_true=make_blobs(n_samples=500,centers=5,cluster_std=0.80,random_state=0)
#plt.scatter(X[:,0],X[:,1],s=50)
#plt.show()
kmeans=KMeans(n_clusters=5)
kmeans.fit(X)
y_predict=kmeans.predict(X)
print(y_predict)
plt.scatter(X[:,0],X[:,1],c=y_predict,s=50,cmap='viridis')#colormap 为viridis
centers=kmeans.cluster_centers_ #训练后的中心
plt.scatter(centers[:,0],centers[:,1],c='black',s=200,alpha=0.5)
plt.show()
plt.scatter()中 c既可以是“black”也可以是与data数量一致的0-n种颜色的数组。
4.2MeanShift均值偏移
import numpy as np
from sklearn.cluster import MeanShift #从聚类库导入,均值偏移算法
import matplotlib.pylab as plt
from matplotlib import style
style.use("ggplot")
from sklearn.datasets._samples_generator import make_blobs
centers=[[2,2],[15,2],[5,10]]
X,y=make_blobs(n_samples=500,centers=centers,cluster_std=1,random_state=0)
#plt.scatter(X[:,0],X[:,1])
#plt.show()
#model fit
ms=MeanShift()
ms.fit(X)
lables=ms.labels_ #labels属于哪类
#print(lables)
cluster_center=ms.cluster_centers_
print(cluster_center)
#plt
colors = 10*['r.','g.','b.','c.','k.','y.','m.']
for i in range(len(X)):
plt.plot(X[i][0],X[i][1],colors[lables[i]],markersize=10)
#聚类中心
plt.scatter(cluster_center[:,0],cluster_center[:,1],marker='x',c='k',s=150,linewidths=5,zorder=10)
plt.show()
先画所以二维坐标的点,然后画聚类中心进行标记。
shiftmean不需要手动确定k值,即cluster_centers_的个数。
4.3测量群集性能
轮廓分析,测量群集见距离,给出轮廓分数,此分数衡量集群中每个点与相邻群集中点的距离。
+1分,样本距离别的集群很远
0 两个相邻集群很近
len(X)):
plt.plot(X[i][0],X[i][1],colors[lables[i]],markersize=10)
#聚类中心
plt.scatter(cluster_center[:,0],cluster_center[:,1],marker=‘x’,c=‘k’,s=150,linewidths=5,zorder=10)
plt.show()
先画所以二维坐标的点,然后画聚类中心进行标记。
shiftmean不需要手动确定k值,即cluster_centers_的个数。
### 4.3测量群集性能
轮廓分析,测量群集见距离,给出轮廓分数,此分数衡量集群中每个点与相邻群集中点的距离。
+1分,样本距离别的集群很远
0 两个相邻集群很近
-1 样本被分配到错误群集