練習:人類動作識別,癌症預測,預測年收入是否大於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)