练习:人类动作识别,癌症预测,预测年收入是否大于50K美元
人类动作识
导入数据
X_train = np.load('./动作分析/x_train.npy')
X_test = np.load('./动作分析/x_test.npy')
y_train = np.load('./动作分析/y_train.npy')
y_test = np.load('./动作分析/y_test.npy')
获取数据
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
预测
y_ = knn.predict(X_test)
查看100个预测结果
y_[:100]
查看测试数据和测试结果得分
knn.score(X_test, y_test)
绘制
label = {1:'步行', 2:'上楼', 3:'下楼',4:'坐着', 5:'站立', 6:'躺着'}
解决中文警告问题
plt.rcParams['font.family']='SimHei' #黑体
可视化展示预测结果
# 6行4列
plt.figure(figsize=(4* 4.5,6* 5.5))
# 绘图
for i in range(24):
axes = plt.subplot(6,4,i+1)
axes.plot(X_test[i*100])
# 如果预测结果不对,粗体标红
if y_test[i*100] != y_[i*100]:
axes.set_title('True:%s\nPredict:%s' % (label[y_test[i*100]], label[y_[i*100]]), fontdict=dict(fontsize=(20), color='r'))
else:
axes.set_title('True:%s\nPredict:%s' % (label[y_test[i*100]], label[y_[i*100]]))
癌症预测
cancer = pd.read_csv('../data/cancer.csv', sep='\t')
cancer
后半截
M: malignant 恶性的
B: benign 良性的
data = cancer.iloc[:, 2:].copy()
target = cancer.Diagnosis.values
data.shape
data.isnull().any()
X_train, X_test, y_train, y_test = train_test_split(data, target, test_size=69)
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)
y_ = knn.predict(X_test)
knn.score(X_test, y_test)
knn.score(X_train, y_train)
这里用knn看不出什么差异,每个图都差不多
所以使用“交叉表”
# 使用交叉表来展示预测结果
pd.crosstab(index=y_, columns=y_test, rownames=['预测值'], colnames=['真实值'], margins=True)
(44 + 22) / 69
预测年收入是否大于50K美元
读取adult.txt文件,最后一列是年收入,并使用KNN算法训练模型,然后使用模型预测一个人的年收入是否大于50
adults = pd.read_csv('./adults.txt')
adults.head(10)
后半截
获取年龄、教育程度、职位、每周工作时间作为机器学习数据
获取薪水作为对应结果
data = adults[['age', 'education', 'occupation','hours_per_week']].copy()
target = adults[['salary']]
display(data,target)
data.dtypes
数据转换,将String类型数据转换为int (因为机器学习只认识数字,需要将 ‘education’, ‘occupation’ 的字符串分类转换成数字分类,用0,1,2…代替)
【知识点】map方法,进行数据转换
-
常规map方法:映射一个字典,再进行转换
-
高级方法:np.argwhere(), 备注:arg开头的都是返回index
可将转换方法写成函数
def convert_workclass(item): index = np.argwhere(workclass == item)[0,0] return index
将 ‘education’, ‘occupation’ 的字符串分类转换成数字分类,用0,1,2…代替
cols= ['education', 'occupation'] for column in cols: uni = data[column].unique() #注意:循环体重定义函数,减少外部调用函数的时间复杂度 def convert(item): index = np.argwhere(uni == item)[0,0] return index data[column] = data[column].map(convert)
查看数据类型,是否转换成功
data.dtypes
data
切片:训练数据和预测数据
knn = KNeighborsClassifier()
from sklearn.model_selection import train_test_split
X_train, x_test, y_train, y_test = train_test_split(data,target,test_size=0.1)
生成算法
第一步:训练数据
knn.fit(X_train, y_train['salary'].values)
第二步:预测数据
y_ = knn.predict(x_test)
display(y_, y_train['salary'].values)
得分
knn.score(X_train, y_train)
knn.score(x_test,y_test)
保存训练模型
from sklearn.externals import joblib
from sklearn.externals import joblib
joblib.dump(knn, 'knn.pkl')
导入模型
knn2 = joblib.load('knn.pkl')
y2_ = knn.predict(x_test)
display(y2_, y_train['salary'].values)